Offri agli utenti la massima capacità di upload; limitare il numero di file che un utente può caricare o limitare il numero di file per caricamento


9

Sto utilizzando la libreria multimediale sul front-end del mio sito Web e vorrei impedire agli utenti di inviare spam al mio server caricando un numero illimitato di file.

Come tale, mi piacerebbe fare uno o forse tutti i seguenti:

  1. Offri agli utenti la massima capacità di upload; cioè gli utenti possono caricare fino a 10 megabyte di file.
  2. Limitare il numero di file che un utente può caricare per post
  3. Limitare il numero di file che un utente può caricare quando fa clic sul pulsante "Inserisci", ovvero l'uploader Flash e l'uploader classico ti consentiranno di caricare, ad esempio, solo 2 file alla volta.

Nessuno di questi è a prova di proiettile, ma si spera che renderebbe difficile tale "spamming".

Grazie in anticipo,

Risposte:


11

Supponendo che tu stia fornendo funzionalità di upload tramite le funzioni native di WordPress, simili wp_handle_uploado qualcosa di più di alto livello, arriviamo alla conclusione che verranno tirati diversi hook.

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

La wp_handle_uploadfunzione sarebbe probabilmente l'ultima funzione nativa per toccare il file e conoscerebbe tutte le informazioni necessarie per tenerne traccia.

Sono interessanti due ganci all'interno di questa funzione: wp_handle_uploade wp_handle_upload_prefilter. Quest'ultimo viene per primo, questo potrebbe verificare i limiti attuali e impedire il caricamento del file. Il primo tracciava le dimensioni dei file e contava. La memorizzazione delle informazioni sarebbe gestita da nientemeno che 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;
}

Teoricamente, questo funziona; praticamente - non testato. Fateci sapere come va.

I limiti di caricamento per post verrebbero mantenuti nella meta post, probabilmente come {$user_id}_upload_countecc. Non vedo perché non funzionerebbe.

Se stai usando un codice personalizzato per gestire i caricamenti (cosa che doublt), puoi implementare le tue azioni e i tuoi filtri proprio come wp_handle_uploadsfa.


Ciao anima - eccellente post, grazie mille. Lo sto facendo funzionare ora. Potresti spiegare cosa fanno queste righe? $upload_bytes_limit_reached = apply_filters( 'wpse47580_upload_bytes_limit_reached', 1024*1024*10 ) > ( $filesize + $upload_bytes );
Dunc

Ho aggiornato il codice per modificare le righe che ho appena menzionato, poiché mi stavano causando problemi - Immagino che mi manchi una funzione di filtro ma non sono sicuro di cosa avrei dovuto fare con esso! Ho pubblicato il mio codice come risposta, potresti criticarlo?
Dunc

Il apply_filterscodice consentirebbe ad altri plugin di collegarsi lì, ritenendo che sarebbe utile. Potresti descrivere la natura dei problemi?
soulseekah,

1
Devi restituire $ args in wp_handle_upload altrimenti l'immagine non verrà salvata!
skylarkcob,

Inoltre, ci deve essere del codice che gestirà la cancellazione degli allegati e riduca i meta campi upload_count e upload_bytes.
Svetoslav Marinov,

1

Ho modificato il codice di Soulseekah in qualche modo poiché le apply_filtervariabili non funzionavano per me, probabilmente perché non le capisco!

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

Sarebbe davvero semplice creare un plugin, quindi potrei rilasciarlo ad un certo punto in futuro, quando ho sviluppato un'interfaccia per esso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.