사용자에게 최대 업로드 용량을 제공하십시오. 사용자가 업로드 할 수있는 파일 수 제한 또는 업로드 당 파일 수 제한


9

웹 사이트의 프런트 엔드에서 미디어 라이브러리를 사용하고 있으며 사용자가 무제한으로 파일을 업로드하여 서버를 스팸으로 만들지 못하게하고 싶습니다.

따라서 아래 중 하나 또는 모두를 수행하고 싶습니다.

  1. 사용자에게 최대 업로드 용량을 제공하십시오. 즉, 사용자는 최대 10MB의 파일을 업로드 할 수 있습니다.
  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_uploadwp_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 );
02 초

방금 언급 한 줄을 변경하여 코드를 업데이트하여 문제를 일으켰습니다. 필터 기능이 누락 된 것 같지만 어떻게 해야하는지 잘 모르겠습니다! 내 코드를 답변으로 게시했습니다. 비평 할 수 있습니까?
초에 dunc

apply_filters코드를 사용하면 다른 플러그인을 연결할 수 있습니다. 문제의 본질을 설명해 주시겠습니까?
soulseekah

1
wp_handle_upload에 $ args를 반환해야합니다. 그렇지 않으면 이미지가 저장되지 않습니다!
skylarkcob

또한 첨부 파일 삭제를 처리하고 upload_count 및 upload_bytes 메타 필드를 줄이려면 일부 코드가 있어야합니다.
Svetoslav Marinov 2018 년

1

apply_filter변수가 나를 위해 작동하지 않아 Soulseekah의 코드를 다소 수정했습니다. 아마도 이해할 수 없기 때문입니다!

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

플러그인을 만드는 것이 정말 간단하므로 나중에 인터페이스를 개발했을 때 언젠가 릴리스 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.