Proporcionar a los usuarios una capacidad de carga máxima; limite la cantidad de archivos que un usuario puede cargar O limite la cantidad de archivos por carga

9

Estoy usando la biblioteca de medios en la parte delantera de mi sitio web y me gustaría evitar que los usuarios puedan enviar correo basura a mi servidor cargando una cantidad ilimitada de archivos.

Como tal, me gustaría hacer uno o quizás todo lo siguiente:

  1. Proporcione a los usuarios una capacidad de carga máxima; es decir, los usuarios pueden cargar hasta 10 megabytes de archivos.
  2. Limite la cantidad de archivos que un usuario puede cargar por publicación
  3. Limite la cantidad de archivos que un usuario puede cargar cuando hace clic en el botón "Insertar", es decir, el cargador Flash y el cargador clásico solo le permitirán cargar, por ejemplo, 2 archivos a la vez.

Ninguno de estos está a prueba de balas, pero con suerte harán que ese "spamming" sea una dificultad.

Gracias de antemano,

    
pregunta dunc 01.04.2012 - 16:38

2 respuestas

11

Suponiendo que está proporcionando la funcionalidad de carga a través de las funciones nativas de WordPress, como wp_handle_upload o algo más alto A nivel, llegamos a la conclusión de que se van a tirar varios ganchos.

enlace

La función wp_handle_upload probablemente sea la última función nativa en tocar el archivo, y conocerá toda la información necesaria para realizar un seguimiento.

Dos ganchos dentro de esta función son de interés: wp_handle_upload y wp_handle_upload_prefilter . Lo último es lo primero, esto podría compararse con los límites actuales y evitar que se cargue el archivo. El primero rastrearía los tamaños de archivo y contaría. El almacenamiento de la información será manejado por nada menos 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;
}

Teóricamente, esto funciona; prácticamente - no probado. Háganos saber cómo va.

Los límites de carga por publicación se mantendrían en el meta de la publicación, probablemente como {$user_id}_upload_count , etc. No veo por qué no funcionaría.

Si estás usando un código personalizado para manejar las subidas (que yo doblé), puedes implementar tus propias acciones y filtros al igual que wp_handle_uploads .

    
respondido por el soulseekah 01.04.2012 - 20:29
1

He modificado un poco el código de Soulseekah, ya que las variables apply_filter no funcionaban para mí, ¡probablemente porque no las entiendo!

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

Esto sería realmente sencillo para hacer un complemento, por lo que podría lanzarlo en algún momento en el futuro, cuando haya desarrollado una interfaz para él.

    
respondido por el dunc 02.04.2012 - 12:33

Lea otras preguntas en las etiquetas