Надати користувачам максимальну завантаженість; обмежити кількість файлів, які користувач може завантажувати АБО обмежити кількість файлів за завантаження


9

Я використовую Медіатеку на передній частині свого веб-сайту, і я хотів би не допустити, щоб користувачі могли спамувати мій сервер, завантажуючи необмежену кількість файлів.

Тому я хотів би зробити одне чи, можливо, все нижче:

  1. Надати користувачам максимальну завантаженість; тобто користувачі можуть завантажувати до 10 мегабайт файлів.
  2. Обмежте кількість файлів, які користувач може завантажувати щоденно
  3. Обмежте кількість файлів, які користувач може завантажувати, натискаючи кнопку "Вставити", тобто завантажувач Flash та Класичний завантажувач дозволяють завантажувати, наприклад, 2 файли одночасно.

Жоден з них не є кулезахисним, але, сподіваємось, складе таке "спам" складність.

Спасибі заздалегідь,

Відповіді:


11

Припускаючи, що ви надаєте функцію завантаження за допомогою вроджених функцій WordPress, lik wp_handle_uploadабо чогось більш високого рівня, ми дійшли висновку, що кілька крюків буде витягнуто.

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

Ця wp_handle_uploadфункція, ймовірно, буде останньою функцією, яка торкається файлу, і буде знати всю інформацію, необхідну для відстеження.

Цікавлять два гачки всередині цієї функції: wp_handle_uploadі wp_handle_upload_prefilter. Останнє перше, це може перевірити відповідні обмеження та запобігти завантаженню файлу. Перший буде відслідковувати розміри файлів і рахувати. Зберігання інформації займається не хто інший, як 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;
}

Теоретично це працює; практично - неперевірений. Дайте нам знати, як це йде.

Обмеження щодо завантаження після публікації зберігатимуться у мета публікації, можливо, {$user_id}_upload_countтощо. Не розумію, чому це не вийде.

Якщо ви використовуєте спеціальний код для обробки завантажень (що я сумніваюся), то ви можете реалізувати власні дії та фільтри так само, як wp_handle_uploadsце робиться.


Привіт Душа - відмінний пост, дуже дякую. Я зараз працюю над цим. Чи можете ви пояснити, що роблять ці рядки? $upload_bytes_limit_reached = apply_filters( 'wpse47580_upload_bytes_limit_reached', 1024*1024*10 ) > ( $filesize + $upload_bytes );
dunc

Я оновив код, щоб змінити рядки, про які я згадав, оскільки вони створювали мені проблеми - я думаю, мені не вистачає функції фільтра, але я не впевнений, що мені потрібно було робити з цим! Я опублікував свій код як відповідь, чи можете ви його критикувати?
dunc

apply_filtersКод дозволить іншому плагіни вклинитися туди, подумав , що було б корисно. Чи могли б ви описати природу проблем?
соулсееках

1
Ви повинні повернути $ args у wp_handle_upload, інакше зображення не буде збережено!
skylarkcob

Крім того, повинен бути якийсь код, який буде обробляти видалення вкладених файлів і зменшити мета-поля upload_count та upload_bytes.
Светослав Маринов

1

Я дещо змінив код Soulseekah, оскільки apply_filterзмінні не працювали для мене - можливо, тому, що я їх не розумію!

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

Це було б дуже просто зробити плагін, щоб я міг випустити його в якийсь момент в майбутньому, коли я розробив для нього інтерфейс.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.