web-dev-qa-db-fra.com

Donner aux utilisateurs une capacité de téléchargement maximale; limiter le nombre de fichiers qu'un utilisateur peut télécharger OR limiter le nombre de fichiers par téléchargement

J'utilise la médiathèque au début de mon site Web et j'aimerais empêcher les utilisateurs de pouvoir envoyer du courrier indésirable à mon serveur en téléchargeant un nombre illimité de fichiers.

En tant que tel, j'aimerais faire un ou peut-être tout ce qui suit:

  1. Donner aux utilisateurs une capacité de téléchargement maximale; les utilisateurs peuvent télécharger jusqu'à 10 mégaoctets de fichiers.
  2. Limiter le nombre de fichiers qu'un utilisateur peut télécharger poste par poste
  3. Limitez le nombre de fichiers qu'un utilisateur peut télécharger lorsqu'il clique sur le bouton "Insérer", c'est-à-dire que le programme de téléchargement Flash et le programme de téléchargement classique ne vous permettent de télécharger, par exemple, que deux fichiers à la fois.

Aucun de ceux-ci n'est à l'épreuve des balles, mais ils feraient, espérons-le, un tel problème de "spamming".

Merci d'avance,

9
dunc

En supposant que vous fournissiez une fonctionnalité de téléchargement via les fonctions natives de WordPress, comme wp_handle_upload ou quelque chose de plus haut niveau, nous en arrivons à la conclusion que plusieurs hooks vont être tirés.

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

La fonction wp_handle_upload serait probablement la dernière fonction native à toucher le fichier, et connaîtrait toutes les informations nécessaires pour garder une trace.

Deux crochets à l'intérieur de cette fonction sont intéressants: wp_handle_upload et wp_handle_upload_prefilter. Ce dernier point vient en premier, ce qui pourrait vérifier les limites actuelles et empêcher le téléchargement du fichier. Le premier suivrait la taille et le nombre de fichiers. Le stockage des informations serait géré par nul autre que update_user_meta .

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;
}

Théoriquement, cela fonctionne; pratiquement - non testé. Tiens nous au courant de comment ça se passe.

Les limites d'envoi par publication seraient conservées dans la méta de publication, probablement comme {$user_id}_upload_count, etc. Ne voyez pas pourquoi cela ne fonctionnerait pas.

Si vous utilisez un code personnalisé pour gérer les téléchargements (ce que je double), vous pouvez alors mettre en œuvre vos propres actions et filtres, comme le fait wp_handle_uploads.

11
soulseekah

J'ai légèrement modifié le code de Soulseekah car les variables apply_filter ne fonctionnaient pas pour moi - probablement parce que je ne les comprenais pas!

# [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;
}

Ce serait très simple de créer un plugin, je pourrais donc le publier à l'avenir, lorsque j'aurais développé une interface pour celui-ci.

1
dunc