如何检测用户上载的文件是否大于post_max_size?

问题描述

| 如何以理智的方式处理超过http0的http上传? 在我的配置中,“ 0”比“ 2”大几MB 我遇到的问题是: 如果用户上传文件超过
post_max_size
_POST数组为空 _FILES数组为空,并且其中不存在任何错误代码。 没有其他信息可以通过这些方式访问哪种形式的帖子。 问题的一部分是接收脚本根据POST的内容采取不同的操作。 我确实可以访问
_SERVER
变量,并且可以了解发生了什么的线索,即
CONTENT_TYPE
CONTENT_LENGTH
REQUEST_METHOD
。但是,根据这些内容进行猜测似乎很成问题。 发现MEMORY_LIMIT(设置为相关大小的10倍)和Apaches LimitRequestBody(设置为无限制)没有问题。 就目前情况而言,我什至很难向用户提供任何有意义的消息。 有什么办法可以保留一些表格数据,以便更好地了解出了什么问题?我非常不愿意离开PHP。     

解决方法

        对于不需要服务器端更改的简单修复,我将使用HTML5 File API在上传之前检查文件的大小。如果超过已知限制,则取消上传。我相信这样会起作用:
function on_submit()
{
  if (document.getElementById(\"upload\").files[0].size > 666)
  {
    alert(\"File is too big.\");
    return false;
  }

  return true;
}

<form onsubmit=\"return on_submit()\">
<input id=\"upload\" type=\"file\" />
</form>
显然,这只是示例的框架,并非每个浏览器都支持。但是使用它并没有什么坏处,因为它的实现方式可以使其优雅地降级为老版本的浏览器。 当然,这并不能解决问题,但至少可以使您的许多用户满意,而所需的工作却很少。 (他们甚至不必等待上传失败。) - 顺便说一句,检查ѭ9与发布和文件数据大小的关系可能有助于检测是否失败。我认为有错误时它将为非零,而
$_POST
$_FILES
都将为空。     ,        根据PHP文档:   如果发布数据的大小大于post_max_size,则$ _POST和$ _FILES超全局变量为空。可以通过各种方式来跟踪,例如通过将$ _GET变量传递给处理数据的脚本,即
,然后检查是否设置了$ _GET [\'processed \']。 如果您需要为特定脚本增加限制,则可以尝试ini_set(\'post-max-size \',$ size_needed);。不过,我不确定是否可以在脚本中覆盖它;该限制可能专门用于阻止您执行自己想做的事情。     ,        我喜欢@Matthew的答案,但需要检查多个上传文件的版本。 这是我的解决方案:
function checkAttachmentsSize() {
    var total = 0;
    var count = 0;

    jQuery(\'input[type=\"file\"]\').each(
        function() {
            if (typeof this.files[0] != \'undefined\') {
                total+= this.files[0].size;
                count++;
            }
        }   
    );

    var word = (count > 1) ? \'s are\' : \' is\';
    if (total > (uploadMax * 1000 * 1000)) {
        alert(\"The attachment file\" + word + \" too large to upload.\");
        return false;
    }

    return true;
}
并且,为完整起见,以下是函数与要提交的表单的绑定:
jQuery(function($) {
    $(\"form\").submit(
        function() {
            return checkAttachmentsSize();
        }   
    });
);
注意: uploadMax是我在计算允许上传的最大大小后通过php设置的变量。     ,        您可以在服务器端解决此问题,而无需诉诸查询字符串。只需将* post_max_size *设置与请求的预期内容长度进行比较即可。以下代码是Kohana的工作方式。
public static function post_max_size_exceeded()
{
    // Make sure the request method is POST
    if (Request::$initial->method() !== HTTP_Request::POST)
        return FALSE;

    // Get the post_max_size in bytes
    $max_bytes = Num::bytes(ini_get(\'post_max_size\'));

    // Error occurred if method is POST,and content length is too long
    return (Arr::get($_SERVER,\'CONTENT_LENGTH\') > $max_bytes);
}
    ,        您可能需要还原为使用flash / silverlight等的内容,例如: http://www.plupload.com/ 或看看基于Java的解决方案... 基本上,这些东西会将上传文件分成更多可管理(可恢复)的块,然后在服务器端重新组装它们。     ,        除非您的上传表单具有文件输入字段以外的其他字段,否则$ _POST应该为空-文件仅通过$ _FILES处理。如果超出了帖子大小,$ _ FILES为空是非常奇怪的-上传处理程序有一个特定的错误代码(1 / UPLOAD_ERR_INI_SIZE)报告这种情况。同时检查ѭ15是否大于upload_max_filesize。 您的网络服务器也可能阻止上传,这可能在调用PHP之前发生。在Apache上,它受ѭ16的控制。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...