给用户最大的上传能力;限制用户可以上传的文件数,或限制每次上传的文件数


9

我正在使用网站前端的媒体库,但我想通过上传无限数量的文件来阻止用户向服务器发送垃圾邮件。

因此,我想执行以下一项或全部操作:

  1. 给用户最大的上传能力;也就是说,用户最多可以上传10 MB的文件。
  2. 限制用户可以按帖子上传的文件数
  3. 限制用户单击“插入”按钮时可以上传的文件数,即Flash上​​载器和Classic上载器一次只能上传2个文件。

这些都不是防弹的,但是希望它们能使这种“垃圾邮件”变得困难。

提前致谢,

Answers:


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 );
2012年

我已经更新了代码,以更改刚才提到的行,因为它们引起了我的问题-我想我缺少过滤器功能,但是我不确定该怎么做!我已经将我的代码发布为答案,您可以批评它吗?
2012年

apply_filters代码将允许其他插件挂接到那里,这将很有用。您能否描述问题的性质?
soulseekah'4

1
您必须在wp_handle_upload中返回$ args,否则图像将不被保存!
skylarkcob

同样,必须有一些代码可以处理附件删除并减少upload_count和upload_bytes元字段。
Svetoslav Marinov 2015年

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

从中制作一个插件真的很简单,所以当我为它开发一个接口时,我可能会在将来的某个时候发布它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.