it-swarm.com.de

Geben Sie den Benutzern eine maximale Upload-Kapazität. Begrenzen Sie die Anzahl der Dateien, die ein Benutzer hochladen kann OR Begrenzen Sie die Anzahl der Dateien pro Upload

Ich verwende die Medienbibliothek im Front-End meiner Website und möchte verhindern, dass Benutzer meinen Server durch das Hochladen einer unbegrenzten Anzahl von Dateien spammen können.

Als solches möchte ich eines oder vielleicht alle der folgenden Dinge tun:

  1. Geben Sie den Benutzern eine maximale Upload-Kapazität. Das heißt, Benutzer können bis zu 10 Megabyte an Dateien hochladen.
  2. Begrenzen Sie die Anzahl der Dateien, die ein Benutzer pro Post hochladen kann
  3. Begrenzen Sie die Anzahl der Dateien, die ein Benutzer hochladen kann, wenn er auf die Schaltfläche "Einfügen" klickt. Mit dem Flash-Uploader und dem klassischen Uploader können Sie beispielsweise nur zwei Dateien gleichzeitig hochladen.

Keines davon ist kugelsicher, aber sie würden hoffentlich ein solches "Spammen" zu einer Schwierigkeit machen.

Danke im Voraus,

9
dunc

Unter der Annahme, dass Sie Upload-Funktionen über die nativen Funktionen von WordPress wie wp_handle_upload oder etwas Höheres bereitstellen, kommen wir zu dem Schluss, dass mehrere Hooks gezogen werden.

http://core.trac.wordpress.org/browser/tags/3.3/wp-admin/includes/file.php#L212

Die Funktion wp_handle_upload wäre wahrscheinlich die letzte native Funktion, die die Datei berührt, und würde alle Informationen kennen, die erforderlich sind, um den Überblick zu behalten.

Zwei Haken innerhalb dieser Funktion sind von Interesse: wp_handle_upload und wp_handle_upload_prefilter. Letzteres steht an erster Stelle. Dies könnte die aktuellen Grenzwerte überprüfen und das Hochladen der Datei verhindern. Ersteres würde die Dateigröße verfolgen und zählen. Das Speichern der Informationen würde von niemand anderem als update_user_meta gehandhabt.

add_filter( 'wp_handle_upload', 'wpse47580_update_upload_stats' );
function wpse47580_update_upload_stats( $args ) {
    $file = $args['file'];
    $size = filesize( $file ); // bytes

    $user_id = get_current_user_id();

    $upload_count = get_user_meta( $user_id, 'upload_count', $single = true );
    $upload_bytes = get_user_meta( $user_id, 'upload_bytes', $single = true );

    update_user_meta( $user_id, 'upload_count', $upload_count + 1 );
    update_user_meta( $user_id, 'upload_bytes', $upload_bytes + $size );
}

add_filter( 'wp_handle_upload_prefilter', 'wpse47580_check_upload_limits' );
function wpse47580_check_upload_limits( $file ) {
    $user_id = get_current_user_id();

    $upload_count = get_user_meta( $user_id, 'upload_count', $single = true );
    $upload_bytes = get_user_meta( $user_id, 'upload_bytes', $single = true );

    $filesize = /* get filesize from $file array */;
    $upload_bytes_limit_reached = apply_filters( 'wpse47580_upload_bytes_limit_reached', 1024*1024*10 ) > ( $filesize + $upload_bytes );
    $upload_count_limit_reached = apply_filters( 'wpse47580_upload_count_limit_reached', 100 ) > ( $upload_count + 1 );

    if ( $upload_count_limit_reached || $upload_bytes_limit_reached )
        $file['error'] = 'Upload limit has been reached for this account!';

    return $file;
}

Theoretisch funktioniert das; praktisch - ungetestet. Lass uns wissen, wie es geht.

Upload-Limits pro Post werden in der Post-Meta beibehalten, wahrscheinlich wie {$user_id}_upload_count usw. Sehen Sie nicht, warum das nicht funktioniert.

Wenn Sie benutzerdefinierten Code für Uploads verwenden (was ich zweifle), können Sie Ihre eigenen Aktionen und Filter implementieren, genau wie wp_handle_uploads.

11
soulseekah

Ich habe Soulseekahs Code etwas geändert, da die apply_filter Variablen für mich nicht funktionierten - wahrscheinlich, weil ich sie nicht verstehe!

# [File Upload]
#
# Two filters to give users a maximum upload limit of 10Mb and 100 files.
# This function runs after the file has been uploaded.
add_filter( 'wp_handle_upload', 'wpse47580_update_upload_stats' );
function wpse47580_update_upload_stats( $args ) {
    $size = filesize( $args['file'] );

    $user_id = get_current_user_id();

    $upload_count = get_user_meta( $user_id, 'upload_count', true );
    $upload_bytes = get_user_meta( $user_id, 'upload_bytes', true );

    update_user_meta( $user_id, 'upload_count', $upload_count + 1 );
    update_user_meta( $user_id, 'upload_bytes', $upload_bytes + $size );
}

# This function runs before the file is uploaded.
add_filter( 'wp_handle_upload_prefilter', 'wpse47580_check_upload_limits' );
function wpse47580_check_upload_limits( $file ) {
    $user_id = get_current_user_id();

    $upload_count = get_user_meta( $user_id, 'upload_count', true );
    $upload_bytes = get_user_meta( $user_id, 'upload_bytes', true );

    $filesize = $file['size']; // bytes

    $upload_bytes_limit_reached = ( ( $filesize + $upload_bytes ) > ( 1024 * 1024 * 10 ) );

    $upload_count_limit_reached = ( $upload_count + 1 ) > 100;

    if ( $upload_count_limit_reached || $upload_bytes_limit_reached )
        $file['error'] = 'Upload limit has been reached for this account!';

    return $file;
}

Es wäre wirklich einfach, ein Plugin daraus zu machen, damit ich es irgendwann in der Zukunft veröffentlichen kann, wenn ich ein Interface dafür entwickelt habe.

1
dunc