请注意,当您要上传非常大的文件(或要为测试目的将限制器设置得非常高)时,所有上传文件大小限制器都存储在带符号的 32 位整型中。这意味着设置高于约 2.1 GB 的限制会导致 PHP 看到一个很大的负数。我还没有找到任何解决方法。
MAX_FILE_SIZE
项不能指定大于 php.ini 文件中 upload_max_filesize 设置的文件大小。默认值为 2 兆字节。
如果启用了内存限制,则可能需要更大的 memory_limit。确保将 memory_limit 设置得足够大。
如果 max_execution_time 设置得太小,脚本执行时间可能会超过该值。确保将 max_execution_time
设置得足够大。
注意: max_execution_time 仅影响脚本本身的执行时间。任何在脚本执行之外发生的活动所花费的时间,例如使用 system() 的系统调用、sleep() 函数、数据库查询、文件上传过程所花费的时间等,在确定脚本已运行的最大时间时不包括在内。
max_input_time 设置脚本允许接收输入的最大时间(以秒为单位);这包括文件上传。对于大型或多个文件,或连接速度较慢的用户,默认的 60
秒可能会超过。
如果 post_max_size 设置得太小,则无法上传大型文件。确保将 post_max_size
设置得足够大。
max_file_uploads 配置设置控制在一个请求中可以上传的最大文件数量。如果上传的文件超过了限制,那么 $_FILES 在达到限制后将停止处理文件。例如,如果将 max_file_uploads 设置为 10
,那么 $_FILES 将永远不会包含超过 10 个项目。
不验证操作的文件可能意味着用户可以访问其他目录中的敏感信息。
由于目录列表样式数量众多,我们无法保证文件(如包含空格的名称)能得到正确处理。
开发人员不能在同一表单变量中混合使用普通 input
字段和文件上传字段(通过使用类似 foo[]
的 input
名称)。
请注意,当您要上传非常大的文件(或要为测试目的将限制器设置得非常高)时,所有上传文件大小限制器都存储在带符号的 32 位整型中。这意味着设置高于约 2.1 GB 的限制会导致 PHP 看到一个很大的负数。我还没有找到任何解决方法。
如果使用 IIS 7.0 或更高版本,则默认情况下启用请求筛选,并且允许的最大内容长度设置为 30 MB。
如果要允许上传超过 30 MB 的文件,则必须更改此值。
示例 web.config 条目
<configuration>
</system.webServer>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="314572800"/>
</requestFiltering>
</security>
</system.webServer>
</configuration>
上述设置将允许发送 300 MB 的数据作为请求。希望这对某些人有所帮助。
[编辑注:更准确地说,在 PHP 7.1 之前,MAX_FILE_SIZE 不能超过 PHP_INT_MAX。]
请注意,MAX_FILE_SIZE 字段不能超过 2147483647。任何更大的值都将导致上传错误,该错误将在上传结束时显示。
这是由相关的 C 代码解释的
if (!strcasecmp(param, "MAX_FILE_SIZE")) {
max_file_size = atol(value);
}
字符串被转换为长整型,其最大值为... 2147483647
似乎在 php-7.1.0beta3 之后得到了修复 (https://github.com/php/php-src/commit/cb4c195f0b85ca5d91fee1ebe90105b8bb68356c)
Macintosh OS(不确定 OSx)使用双叉文件系统,与世界其他地方不同;-)。每个 Macintosh 文件都有一个数据叉和一个资源叉。当一个双叉文件遇到单叉文件系统时,总有一个必须消失,而消失的是资源叉。这被认为是一个问题(从一开始就是一个糟糕的想法),苹果开始建议开发人员避免将重要文件信息放在文件的资源叉部分,但有些文件仍然对此非常敏感。需要注意的主要文件是 Macintosh 字体文件和可执行文件,一旦资源叉从 Macintosh 字体或可执行文件中消失,它就变得毫无用处。为了保护文件,它们应该在上传之前被压缩或打包,以保护资源叉。
大多数 Mac FTP 客户端(如 Fetch)允许文件以 Macbinhex 格式上传,这也能在通过 FTP 传输文件时保护资源叉。我没有在任何 Mac 浏览器中看到过类似的功能(但我也没有做过太多挖掘)。
供您参考,苹果确实有一个名为 ResEdit 的旧实用程序,它允许您操作文件的资源叉部分。
如果 UPLOAD_ERR_PARTIAL 错误出现概率不确定:HTTPD(例如 Apache)应该使用 'Accept-Ranges: none' 响应头字段。
以下情况还可能导致您的上传失败。如果您使用 Squid 或类似的代理服务器,请确保它没有限制 HTTP 头的大小。这个问题困扰了我好几个星期!
对 admin at creationfarm dot com 的回复,运行在 NTFS 磁盘上的 Mac OS X 和 Windows 也使用多流文件系统。在 HTTP 上传中,仍然只传输数据流。最好将 Mac OS X 文件打包成 .dmg 文件而不是 zip 文件,但普通用户会发现 zip 文件更容易使用,并且它们在更多平台上受支持。
请注意,为整个服务器或整个虚拟主机设置较大的 post_max_size 或 upload_max_filesize 并不是一个好主意,因为它可能会导致安全风险增加。
风险在于攻击者可能会发送非常大的 POST 请求,并使您的服务器内存和 CPU 过载,因为它必须在将这些请求处理到您的 PHP 脚本之前解析和处理它们。
因此,最好将更改此设置限制为某些文件或目录。例如,如果我想在 /admin/files/ 和 /admin/images/ 中使用,我可以使用
<If "%{REQUEST_URI} =~ m!^/admin/(files|images)/! && -n %{HTTP_COOKIE}">
php_value post_max_size 256M
php_value upload_max_filesize 256M
</If>
我还要求请求具有 cookie,以避免基本的攻击。这不会保护您免受来自未经身份验证的用户攻击,但可能会延迟任何攻击。
此设置也可以在 Apache 服务器配置文件和 .htaccess 文件中使用。
我花了一段时间才弄明白这个问题...
我认为这实际上是一个标题问题,但它只
在进行文件上传时才会发生。
如果您在
处理来自执行文件上传的表单的 $_POST[''] 之后尝试 header("location:http://...") 重定向
(即具有 enctype="multipart/form-data"),则重定向
在 IE 中不起作用,如果您在
location: & http 之间没有空格,即
header("location:http://...") 与
header("location: http://...")
===================================
<?php
if ($_POST['submit']=='Upload') {
// 处理文件和重定向...
header("location: http://"..."/somewhere.php");
exit;
}
?>
<html><head></head><body>
<form enctype="multipart/form-data" action="upload.php" method="POST">
<input type="hidden" name="MAX_FILE_SIZE" value="20000">
您的文件:<input name="filename" type="file">
<input name="submit" type="submit" value="Upload">
</form>
</body></html>
===================================
这只有在以下所有条件都满足时才会发生
header("location:http://...") 没有空格
正在处理的表单具有 enctype="multipart/form-data"
浏览器 = IE
要解决此问题,只需添加空格。
希望这对其他人有所帮助。
对于 Apache,还要检查 LimitRequestBody 指令。
如果您运行的是 Red Hat 安装,则可能在 /etc/httpd/conf.d/php.conf 中设置了此项。
默认情况下,我的设置为 512 KB。
如果您想使用 open_basedir 来保护您的服务器(强烈推荐!!!),请记住将您的临时目录添加到 php.ini 中的 open_basedir 值。
示例:open_basedir = <您的 htdocs 根目录等...>:/tmp
(在 gentoo Linux、Apache 2.2、PHP 5.1.6 上测试)