我正在尝试制作文件上传表单并检查PHP文档以刷新我对此主题的记忆。 Here is a link to the relevant article.我突然注意到了这个消息:
好的......说什么?首先,它告诉文件上载字段前面必须。然后它告诉我们这仅仅是为了方便。而且 - 无论如何它都在客户端,所以任何人都可以搞砸它。在谷歌搜索后,我还发现没有已知浏览器支持它的信息。MAX_FILE_SIZE隐藏字段(以字节为单位)必须位于文件输入字段之前,其值是PHP接受的最大文件大小。应始终使用此表单元素,因为它可以节省用户等待传输大文件的麻烦,只是发现它太大而传输失败。请记住:在浏览器端愚弄此设置非常简单,因此不要依赖此功能阻止更大尺寸的文件。它仅仅是应用程序客户端用户的便利功能。然而,最大尺寸的PHP设置(在服务器端)不能被愚弄。
WTF?为什么它说必须在文件上传字段之前,如果它(似乎是为了所有意图和目的)绝对没有意义?我应该把它放在我的HTML中吗?
答案 0 :(得分:34)
在尝试找到有关MAX_FILE_INFO的任何权威信息失败后,我决定采取严厉的措施 - 并且偷看了PHP的神圣来源。
我使用grep:
递归扫描整个PHP源代码grep -ri MAX_FILE_SIZE .
唯一提到此变量的地方是(不包括测试文件夹) - rfc1867.c文件。 完全可以预见,因为rfc1867标准处理文件上传。
相关C代码:
......
if (!strcasecmp(param, "MAX_FILE_SIZE")) {
max_file_size = atol(value);
}
......
......
if (PG(upload_max_filesize) > 0 && (total_bytes+blen) > PG(upload_max_filesize)) {
cancel_upload = UPLOAD_ERROR_A;
} else if (max_file_size && ((total_bytes+blen) > max_file_size)) {
cancel_upload = UPLOAD_ERROR_B;
} else if
....
所以 - 这是上面代码的简短说明:
1)首先我们将MAX_FILE_SIZE的值输入max_file_size变量。
2)然后我们检查max_file_size值是否存在以及已接受的字节总数(total_bytes)+缓冲区中的字节大小(blen)是否超过max_file_size。
3)如果2为真 - 此时我们取消上传,其中包含一些由此常量设置的错误代码:UPLOAD_ERROR_B
但是 - 正如你所看到的 - 在检查max_file_size变量之前 - PHP对upload_max_filesize变量执行完全相同的检查! 所以 - 我们有它。
<强>结论:强> 恕我直言 - 操作是正确的 - 将MAX_FILE_SIZE包含在表格中有0分!只需在php.ini文件中设置upload_max_filesize,或通过ini_set()动态设置。
答案 1 :(得分:16)
目前没有任何浏览器真正关心MAX_FILE_SIZE指令,因此它毫无意义。我想它确实可以让你更精细地控制上传的最大尺寸(如上面所说的海报),而不是使用php.ini,但我个人只是忽略它,你可能也应该这样做。它肯定不会阻止用户上传大于所需的文件 - 手册在这方面相当误导。
答案 2 :(得分:11)
在我们找到支持它的浏览器之前,客户端方面没有任何意义。
但是,在服务器一侧,MAX_FILE_SIZE
确实会影响您从$_FILES['your_file']
获得的值。
假设浏览器的请求实际通过post_max_size
,通常这就是PHP提供的内容:
array(5) {
["name"]=> string(11) "my_upload.dll"
["type"]=> string(24) "application/x-msdownload"
["tmp_name"]=> string(26) "C:\WINDOWS\Temp\php86A.tmp"
["error"]=> int(0) // UPLOAD_ERR_OK
["size"]=> int(238592)
}
但如果上传的文件大小超过MAX_FILE_SIZE
,您就会看到:
array(5) {
["name"]=> string(11) "my_upload.dll"
["type"]=> string(0) ""
["tmp_name"]=> string(0) ""
["error"]=> int(2) // UPLOAD_ERR_FORM_SIZE
["size"]=> int(0)
}
&#34; MAX_FILE_SIZE
上的部分必须位于文件输入字段&#34;不是开玩笑。它实际上是有效的,因为PHP将按顺序解释浏览器的POST
请求有效负载:
<input name=F1 type=file>
<input name=F2 type=file>
F1 and F2 will not be affected by MAX_FILE_SIZE
<input name=MAX_FILE_SIZE value=1024 type=hidden>
<input name=F3 type=file>
<input name=F4 type=file>
F3 and F4 will have MAX_FILE_SIZE = 1024 bytes
<input name=MAX_FILE_SIZE value=0 type=hidden>
<input name=F5 type=file>
<input name=F6 type=file>
F5 and F6 will have MAX_FILE_SIZE = 0 (infinite)
<input name=MAX_FILE_SIZE value=1 type=hidden>
<input name=F7 type=file>
<input name=F8 type=file>
F7 and F8 will have MAX_FILE_SIZE = 1 byte
另请注意,PHP会MAX_FILE_SIZE
不区分地解释,因此maX_fILe_sIZE
和Max_File_SIZE
也会起作用。
答案 3 :(得分:2)
我认为重点是,在用户选择的文件过大的情况下,符合标准的浏览器会阻止表单提交,这样可以节省他们必须执行至少部分上载(可能需要一段时间)的情况。将被拒绝的文件。
在服务器端,PHP仍会检查并强制执行PHP.ini中设置的各种限制,并且会引用上传过于正常的上传这一事实,即$ _FILES中设置的错误代码。您可能会将该字段视为JavaScript验证的类比 - 我们可能会进行快速的客户端检查以方便用户,但我们仍然会进行适当的服务器端测试并对所有请求强制执行。
正如其他人所说的那样,似乎没有任何浏览器真的费心去执行此检查,使其相对无用。
答案 4 :(得分:1)
以下是我的错误,请阅读其他答案,这些答案更明智,更准确(AFAIK)。
我认为这一点完全如下:
此表单元素应始终如此 用它可以节省用户的麻烦 正在等待一个大文件 转移只发现它是 太大而转移失败
是的,它可以被愚弄,因此不应该依赖于防止上传更大的文件,但对于非恶意用户,如果上传的文件大于此字段中的整数,则PHP不允许此上传和在$_FILES
数组中显示错误代码(来源 - comments on php.net)。
答案 5 :(得分:1)
当特定应用程序需要的文件小于php.ini
中的限制时,我用它来设置文件大小限制。我的php脚本检查它,但它是在HTML表单中设置的。不同的表单有不同的文件大小限制。我不确定这是否与预期用途有很大关系,但它使重用我的脚本变得更容易。如果可以在浏览器级别检查它会很好,但它并不是它有用的唯一原因。