我试图创建一个文件上传表单并检查PHP文档以刷新我对这个主题的记忆.以下是相关文章的链接.我突然注意到了这条消息:
MAX_FILE_SIZE隐藏字段(以字节为单位)必须位于文件输入字段之前,其值是PHP接受的最大文件大小.应始终使用此表单元素,因为它可以节省用户等待传输大文件的麻烦,只是发现它太大而传输失败.请记住:在浏览器端愚弄此设置非常简单,因此不要依赖此功能阻止更大尺寸的文件.它仅仅是应用程序客户端用户的便利功能.但是,最大大小的PHP设置(在服务器端)不能被愚弄.
好的......说什么?首先,它告诉它必须在文件上载字段之前.然后它告诉我们这仅仅是为了方便.而且 - 无论如何它都在客户端,所以任何人都可以搞砸它.谷歌搜索后,我也发现没有已知浏览器支持它的信息.
WTF?为什么它说它必须在文件上传字段之前,如果它(似乎所有意图和目的)绝对没有意义?我应该把它放在我的HTML中吗?
Sta*_*ann 34
在尝试找到关于MAX_FILE_INFO的任何权威信息失败之后,我决定采取严厉的措施 - 并且偷看了PHP的神圣来源.
我使用grep以递归方式扫描整个PHP源代码:
grep -ri MAX_FILE_SIZE .
Run Code Online (Sandbox Code Playgroud)
提到这个变量的唯一地方是(不包括测试文件夹) - 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
....
Run Code Online (Sandbox Code Playgroud)
所以 - 这里是上面代码的简短说明:
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变量执行完全相同的检查!因此,我们有它.
结论: IMHO - op是对的 - 将MAX_FILE_SIZE包含在表单中有0分!只需在php.ini文件中设置upload_max_filesize,或通过ini_set()动态设置.
Mee*_*p3D 16
目前没有任何浏览器真正关心MAX_FILE_SIZE指令,因此它毫无意义.我想它确实可以让你对上传的最大尺寸进行更精细的控制(如上面所说的海报),而不是使用php.ini,但我个人只是忽略它,你可能也应该这样做.它肯定不会阻止用户上传大于所需文件 - 手册在这方面相当误导.
Pac*_*ier 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)
}
Run Code Online (Sandbox Code Playgroud)
但如果上传的文件大小超过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)
}
Run Code Online (Sandbox Code Playgroud)
而" MAX_FILE_SIZE必须在文件输入字段之前"的部分不是一个笑话.它实际上是有效的,因为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
Run Code Online (Sandbox Code Playgroud)
还要注意的是PHP解释MAX_FILE_SIZE的情况下不区分大小写,所以maX_fILe_sIZE并Max_File_SIZE就工作了.
| 归档时间: |
|
| 查看次数: |
20551 次 |
| 最近记录: |