我正在使用 PHP 进行文件上传。在PHP manual它显示了一个使用 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 或相关规范中都没有任何内容表明 是这种情况(特别是引入文件的 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);
}
关于php - 在客户端检测文件上传大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2934788/