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

9

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

En tant que tel, j'aimerais en 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. Limitez le nombre de fichiers qu'un utilisateur peut télécharger poste par message
  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, une telle difficulté à "spammer".

Merci d'avance,

    
posée dunc 01.04.2012 - 16:38

2 réponses

11

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

enlace

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 dans 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 les fichiers et les compter. 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é. Dites-nous comment ça se passe.

Les limites de publication 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 ferait wp_handle_uploads .

    
réponse donnée soulseekah 01.04.2012 - 20:29
1

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 comprends 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.

    
réponse donnée dunc 02.04.2012 - 12:33

Lire d'autres questions sur les étiquettes