【问题标题】:Detecting file upload size on the client side?在客户端检测文件上传大小?
【发布时间】:2011-02-25 11:03:47
【问题描述】:

我正在使用 PHP 进行文件上传。在PHP manual 中,它显示了一个使用MAX_FILE_SIZE 隐藏字段的示例,表示它将在客户端(即浏览器)检测文件是否太大。

我刚刚在 Firefox、Chrome 和 IE 中尝试了该示例,但它不起作用。文件总是被上传,即使它比指定的隐藏字段大得多。

顺便说一句,如果文件大于MAX_FILE_SIZE,则调用move_uploaded_file 不起作用,因此该变量似乎对服务器端有影响,但对客户端没有影响。

【问题讨论】:

    标签: php html file-upload


    【解决方案1】:

    开启 MAX_FILE_SIZE

    阅读:

    ...在http://pk.php.net/manual/en/features.file-upload.post-method.php 和其他格式的等效位置,声明 浏览器将 MAX_FILE_SIZE 表单字段的值放入 帐户。

    此信息在网络其他地方和书籍中重复出现,但 似乎源自 PHP 文档(它没有出现在 其他服务器端技术的条款)。

    在任何 HTML、HTTP 或相关规范中都没有说明 就是这种情况(特别是引入文件的 RFC 1867 上传到 HTML 没有提到它,所以它甚至不是一个拼凑的情况 在第一个 RFC 中提到然后被删除)也没有 在 HTML 规范的上下文中有意义(没有任何指示 该特定隐藏输入与文件输入之间的关系)。 我可以在其中任何一个中找到的关于隐藏字段的唯一陈述是 安全注意事项部分中针对用户代理的警告 任何与文件相关的操作都基于隐藏中提到的任何内容 字段。

    似乎没有浏览器将此作为“扩展”。确实鉴于 隐藏字段可能还有其他可能的含义 在处理多个文件上传的应用程序中的该名称,它将具有 任何人都将其视为设计缺陷。

    我认为主流浏览器中没有这样的机制(如果有的话 根本),确实不应该。对它的引用应该从 文档。

    我会进一步建议,因为这个想法是从这个传播而来的 其他地方的文档,关于它不起作用的说明应该是 已添加。

    如果需要或需要一种机制来更快速地处理此问题 某种文件处理问题,那么它需要允许 PHP 的功能 在请求完成之前拦截正在上传的流,这 将与本文档的建议完全不同 应该处理,即使是真的……


    以下代码来自 swfUpload php 实现:

    // Check post_max_size (http://us3.php.net/manual/en/features.file-upload.php#73762)
        $POST_MAX_SIZE = ini_get('post_max_size');
        $unit = strtoupper(substr($POST_MAX_SIZE, -1));
        $multiplier = ($unit == 'M' ? 1048576 : ($unit == 'K' ? 1024 : ($unit == 'G' ? 1073741824 : 1)));
    
        if ((int)$_SERVER['CONTENT_LENGTH'] > $multiplier*(int)$POST_MAX_SIZE && $POST_MAX_SIZE) {
            header("HTTP/1.1 500 Internal Server Error");
            echo "POST exceeded maximum allowed size.";
            exit(0);
        }
    // Validate the file size (Warning the largest files supported by this code is 2GB)
        $max_file_size_in_bytes = 2147483647;           
        $file_size = @filesize($_FILES[$upload_name]["tmp_name"]);
            if (!$file_size || $file_size > $max_file_size_in_bytes) {
                HandleError("File exceeds the maximum allowed size");
                exit(0);
            }
    

    【讨论】:

    • you need to verify the file uploaded was less than MAX_FILE_SIZE using PHP 不,你没有。摆脱这个无用的领域
    • "需要功能以允许 PHP 在请求完成之前拦截正在上传的流" -> 如果请求的长度超过 post_max_size 中指定的限制,PHP 可以拦截请求,但它需要浏览器发送包含的请求标头Content-Length,并且在现代浏览器中,似乎只有 Opera 会发送此标头。
    • aSeptik,问题是关于客户端验证。您编辑的代码比以前的代码没有意义。我很欣赏你所做的小小的搜索工作,但都是徒劳的。回答问题需要一些实践经验,而不仅仅是搜索技巧。
    • @Col。弹片 - 感觉是因为 MAX_FILE_SIZE 不能 100% 可靠,您必须设置一个变量来存储您想要的最大文件大小!
    • @dev-null-deweller - 所以!?您提供的所有方法都是使用flash来实现的!我的回答简单明了!我认为 OP 已经知道您提供的所有链接!
    【解决方案2】:

    这可能目前仅适用于 Firefox 3.6:

    <script type="text/javascript">
        function checkSize()
        {
            var input = document.getElementById("upload");
    
            // check for browser support (may need to be modified)
            if(input.files && input.files.length == 1)
            {           
                if (input.files[0].fileSize > 1024) /* or maybe .size */
                {
                    alert("The file must be less than 1KB");
                    return false;
                }
            }
    
            return true;
        }
    </script>
    
    
    <form method="post" enctype="multipart/form-data" onsubmit="return checkSize()">    
        <input type="file" id="upload" />
        <input type="submit" />
    </form>
    

    http://www.w3.org/TR/FileAPI/

    【讨论】:

      【解决方案3】:

      据我所知,没有简单的跨浏览器解决方案可以实现这一目标。唯一可行的解​​决方案是基于 Flash 或 Java,因为这些技术可以访问文件系统并获取文件信息。

      示例脚本:YUI2 UploaderFancyUploadSWFUpload

      【讨论】:

        【解决方案4】:

        如果您正确使用MAX_FILE_SIZE隐藏字段,文件上传将在上传大小达到指定值时停止。从而省去了用户等待大文件传输的麻烦。 您必须检查文件上传是否停止,在服务器端使用生成的error code

        if($_FILES['userfile']['error'] == 2) 
        {
        die("Maximum file size Exceeded");
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-05-05
          • 2014-03-05
          • 1970-01-01
          • 2019-10-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多