Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
最大文件大小(PHP)-什么';重点是什么?_Php - Fatal编程技术网

最大文件大小(PHP)-什么';重点是什么?

最大文件大小(PHP)-什么';重点是什么?,php,Php,我试图制作一个文件上传表单,并查看了PHP文档以刷新我对该主题的记忆。突然,我注意到这条信息: MAX_FILE_SIZE隐藏字段(以字节为单位)必须位于文件输入字段之前,其值是PHP接受的最大文件大小。应始终使用此表单元素,因为它避免了用户在等待传输大文件时发现文件太大且传输失败的麻烦。请记住:在浏览器端愚弄此设置非常容易,因此永远不要依赖此功能阻止较大大小的文件。对于应用程序客户端的用户来说,它只是一个方便的特性。但是,最大大小的PHP设置(在服务器端)不能被愚弄 好的。。。说什么?首先,它

我试图制作一个文件上传表单,并查看了PHP文档以刷新我对该主题的记忆。突然,我注意到这条信息:

MAX_FILE_SIZE隐藏字段(以字节为单位)必须位于文件输入字段之前,其值是PHP接受的最大文件大小。应始终使用此表单元素,因为它避免了用户在等待传输大文件时发现文件太大且传输失败的麻烦。请记住:在浏览器端愚弄此设置非常容易,因此永远不要依赖此功能阻止较大大小的文件。对于应用程序客户端的用户来说,它只是一个方便的特性。但是,最大大小的PHP设置(在服务器端)不能被愚弄

好的。。。说什么?首先,它告诉您它必须位于文件上载字段之前。然后它告诉我们这仅仅是为了方便。此外,它在客户端,所以任何人都可以搞乱它。在谷歌搜索之后,我还发现没有已知的浏览器支持它


WTF?如果文件上传字段(出于所有目的)看起来毫无意义,为什么说它必须位于文件上传字段之前?我是否应该费心把它放在我的HTML中呢?

下面是我的错误,请阅读其他更明智、更准确的答案(AFAIK)。

我认为这一点正是它所说的:

此表单元素应始终为 因为它为用户节省了 等待一个大文件被删除 被转移后才发现 太大,传输失败


是的,它可以被愚弄,因此不应该依靠它来阻止更大的文件被上传,但是对于非恶意用户,如果上传的文件大于此字段中的整数,PHP将不允许此上传,并在
$\u文件
数组(源-)中显示错误代码。

下面是我的错误,请阅读其他信息更全面、更准确的答案(AFAIK)。

我认为这一点正是它所说的:

此表单元素应始终为 因为它为用户节省了 等待一个大文件被删除 被转移后才发现 太大,传输失败


是的,它可以被愚弄,因此不应该依靠它来阻止更大的文件被上传,但是对于非恶意用户,如果上传的文件大于此字段中的整数,PHP将不允许此上传,并在
$\u files
数组中显示错误代码(源-).

目前,没有浏览器真正关心MAX\u FILE\u SIZE指令,因此它毫无意义。我想它确实可以让你更精确地控制上传时的最大大小(如上面的海报所述),而不是使用php.ini,但就个人而言,我只是忽略了它,你可能也应该这样做。它当然不会阻止用户上传大于所需的文件-该手册在这方面有相当大的误导性。

目前没有浏览器真正关心MAX_file_SIZE指令,因此它毫无意义。我想它确实可以让你更精确地控制上传时的最大大小(如上面的海报所述),而不是使用php.ini,但就个人而言,我只是忽略了它,你可能也应该这样做。它当然不会阻止用户上传大于所需的文件-该手册在这方面有相当大的误导性。

我认为关键是,如果用户选择了太大的文件,符合要求的浏览器将阻止表单提交,这将使他们不必至少执行部分上传(这可能需要一段时间)一个将被拒绝的文件

在服务器端,PHP仍然会检查并强制执行PHP.ini中设置的各种限制,并且会引用一个事实,即正常情况下,上传太大,即$\ u文件中设置的错误代码。您可能会认为该字段类似于JavaScript验证-为了方便用户,我们可能会进行快速客户端检查,但我们仍然会我做了一个适当的服务器端测试,并对所有请求执行它


正如其他人所说,似乎没有任何浏览器真正费心执行此检查,这使得它相对无用。

我认为关键是,如果用户选择的文件太大,一致性浏览器将阻止表单提交,这将使他们不必至少执行部分upload(可能需要一段时间)的文件,该文件将被拒绝

在服务器端,PHP仍然会检查并强制执行PHP.ini中设置的各种限制,并且会引用一个事实,即正常情况下,上传太大,即$\ u文件中设置的错误代码。您可能会认为该字段类似于JavaScript验证-为了方便用户,我们可能会进行快速客户端检查,但我们仍然会我做了一个适当的服务器端测试,并对所有请求执行它


正如其他人所说,似乎没有任何浏览器真正费心执行此检查,这使得它相对无用。

在尝试查找有关MAX_FILE_INFO的任何权威信息失败后,我决定采取严厉措施,并查看PHP的神圣源代码

我使用grep递归扫描了整个PHP源代码:

grep -ri MAX_FILE_SIZE .
唯一提到这个变量的地方是(不包括tests文件夹)-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)的总和是否超过
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)
}
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)
} 
<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