检测客户端的文件上传大小?

时间:2010-05-29 11:22:50

标签: php html file-upload

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

我刚刚尝试过Firefox,Chrome和IE中的示例,但它不起作用。即使文件大于指定的隐藏字段,也始终上传文件。

顺便提一下,如果文件大于MAX_FILE_SIZE,那么调用move_uploaded_file不起作用,所以看起来变量在服务器端有影响,但不是客户端。

4 个答案:

答案 0 :(得分:11)

MAX_FILE_SIZE

阅读本文:

...在http://pk.php.net/manual/en/features.file-upload.post-method.php以及其他格式的等效位置,请说明 浏览器将MAX_FILE_SIZE表单字段的值转换为 帐户。

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

任何HTML,HTTP或相关规范中都没有任何内容可供指明 就是这种情况(特别是引入文件的RFC 1867) 上传到HTML没有提到它,所以它甚至不是一个kludge的情况 这是在第一个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);
        }

答案 1 :(得分:6)

这可能仅适用于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/

答案 2 :(得分:3)

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

示例脚本:YUI2 UploaderFancyUploadSWFUpload

答案 3 :(得分:1)

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

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