繁体   English   中英

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

[英]Detecting file upload size on the client side?

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

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

顺便说一句,如果文件大于MAX_FILE_SIZE那么调用move_uploaded_file不起作用,所以看起来变量在服务器端有效,但在客户端没有效果。

MAX_FILE_SIZE上

读这个:

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

这些信息在网络和书籍的其他地方重复出现,但似乎源自PHP文档(它不会出现在其他服务器端技术方面 )。

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

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

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

示例脚本: YUI2 UploaderFancyUploadSWFUpload

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM