Cung cấp cho người dùng khả năng tải lên tối đa; giới hạn số lượng tệp mà người dùng có thể tải lên HOẶC giới hạn số lượng tệp trên mỗi lần tải lên


9

Tôi đang sử dụng Thư viện phương tiện ở mặt trước của trang web của mình và tôi muốn ngăn người dùng có thể spam máy chủ của tôi bằng cách tải lên số lượng tệp không giới hạn.

Như vậy, tôi muốn làm một hoặc có thể tất cả những điều dưới đây:

  1. Cung cấp cho người dùng khả năng tải lên tối đa; tức là người dùng có thể tải lên tối đa 10 megabyte tệp.
  2. Giới hạn số lượng tệp mà người dùng có thể tải lên trên cơ sở mỗi bài đăng
  3. Giới hạn số lượng tệp mà người dùng có thể tải lên khi họ nhấp vào nút "Chèn", tức là trình tải lên Flash và trình tải lên Cổ điển sẽ chỉ cho phép bạn tải lên, ví dụ, 2 tệp cùng một lúc.

Không ai trong số này chống đạn nhưng họ hy vọng sẽ làm cho việc "spam" trở nên khó khăn.

Cảm ơn trước,

Câu trả lời:


11

Giả sử rằng bạn đang cung cấp chức năng tải lên thông qua các chức năng gốc của WordPress, thích wp_handle_uploadhoặc một cái gì đó ở cấp độ cao hơn, chúng tôi đi đến kết luận rằng một số móc sẽ được kéo.

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

Các wp_handle_uploadchức năng có lẽ sẽ là chức năng có nguồn gốc cuối cùng để chạm vào tập tin, và sẽ biết tất cả những thông tin đó là cần thiết để theo dõi.

Hai móc bên trong chức năng này được quan tâm: wp_handle_uploadwp_handle_upload_prefilter. Cái sau có trước, cái này có thể kiểm tra các giới hạn hiện tại và ngăn không cho tập tin được tải lên. Các cựu sẽ theo dõi tập tin và đếm. Lưu trữ thông tin sẽ được xử lý bởi không ai khác hơn 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;
}

Về mặt lý thuyết, điều này hoạt động; thực tế - chưa được kiểm tra Hãy cho chúng tôi biết làm thế nào nó đi.

Mỗi giới hạn tải lên bài đăng sẽ được giữ trong meta bài đăng, có thể như {$user_id}_upload_countv.v. Đừng hiểu tại sao điều đó không hiệu quả.

Nếu bạn đang sử dụng mã tùy chỉnh để xử lý các video tải lên (mà tôi nhân đôi), thì bạn có thể thực hiện các hành động và bộ lọc của riêng mình giống như wp_handle_uploadsvậy.


Hi Soul - bài xuất sắc, cảm ơn rất nhiều. Tôi đang làm việc này bây giờ. Bạn có thể giải thích những gì những dòng này làm gì? $upload_bytes_limit_reached = apply_filters( 'wpse47580_upload_bytes_limit_reached', 1024*1024*10 ) > ( $filesize + $upload_bytes );
dunc

Tôi đã cập nhật mã để thay đổi các dòng tôi vừa đề cập, vì chúng gây ra sự cố cho tôi - Tôi đoán tôi đang thiếu chức năng lọc nhưng tôi không chắc mình cần phải làm gì với nó! Tôi đã đăng mã của mình như một câu trả lời, bạn có thể phê bình nó không?
dunc

Các apply_filtersmã này sẽ cho phép các plugin khác để móc vào đó, nghĩ rằng sẽ có ích. Bạn có thể mô tả bản chất của các vấn đề?
soulseekah

1
Bạn phải trả lại $ args trong wp_handle_upload nếu không hình ảnh sẽ không được lưu!
skylarkcob

Ngoài ra, phải có một số mã sẽ xử lý xóa tệp đính kèm và để giảm các trường meta upload_count và upload_bytes.
Svetoslav Marinov

1

Tôi đã sửa đổi mã của Soulseekah phần nào vì các apply_filterbiến không hoạt động với tôi - có lẽ vì tôi không hiểu chúng!

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

Điều này sẽ thực sự đơn giản để tạo một plugin từ đó vì vậy tôi có thể phát hành nó vào một lúc nào đó trong tương lai, khi tôi đã phát triển một giao diện cho nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.