POST请求的Content-Length超过了限制。

105

当用户上传文件时,我在php的错误日志中会看到类似的错误

PHP警告:POST内容长度为11933650字节,超出了未知行上限8388608字节。

我在public_html中创建了一个自定义的php.ini文件,这样做可以解决问题吗?如果设置为大约1GB,我需要设置多少?我将在php.ini中更改我的设置,这是否能解决问题?

upload_max_filesize = 1000M ;1GB
post_max_size = 1000M

我应该将"memory_limit"设置为多少?

同时,在我的脚本中,检查上传文件大小是否小于1GB的代码是否正确?

if($_FILES["uploadedfile"]["size"]<1000000)

5
你确定你正在编辑正确的php.ini文件吗? - Pekka
你是否在编辑正确的php.ini文件(可能有多个文件)?是否有其他东西重置了设置?(例如,调用了 php_ini_set 函数吗?) - Piskvor left the building
我在public_html中创建了一个自定义的php.ini文件。 - daza166
@daza:你不能随意放置php.ini文件。PHP只会检查特定的位置,而“当前目录”不是其中之一。您可以在httpd.conf和/或.htaccess文件中使用‘php_value’指令来设置某个目录中的文件,但否则您必须在主.ini文件中进行更改。使用php_info()命令查看您的“本地”设置以及正在使用哪些.ini文件。 - Marc B
2
创建一个名为 "info.php" 的文件,文件内容为 <?php phpinfo(); ?>,然后将其复制到 public_html 目录中,并在浏览器中访问该文件。接着检查 upload_max_filesize 参数的值是否正确。 - DanielB
显示剩余2条评论
10个回答

102

8388608个字节等于8M,在PHP中是默认限制。这些更改php.ini文件确实可以解决问题(确保在更改后重新启动Apache服务器)。

这里不需要更改内存限制。


请确保在 .ini 文件中进行更改后重新启动服务器。 - Sandhu
1
如果您正在使用nginx + php fpm,请确保重新启动php守护进程 sudo service php5-fpm restart - Gourneau
1
重启解决了我的问题。+1 谢谢 ;) - Refilon
1
让我在这里分享一下我的经验,重启后出现了“stop: Unknown instance:”错误,它只是创建了一个新的php5-fpm实例,但我的Web服务器仍在使用旧的实例,然后我不得不执行“sudo killall -KILL php5-fpm”,然后再执行“sudo service php5-fpm start”。 - Memes
根据处理上传的 PHP 进程中正在执行的其他任务,可能需要将 memory_limit 增加到比所需的最大上传大小更大的数量。 - Craig Finch

49

建议您在php.ini文件中,将post_max_size从8M更改为32M。


44

你只需要在php.ini文件中进行设置

然后设置:

upload_max_filesize = 1000M;
post_max_size = 1000M;

然后重新启动你的XAMPP。


20

尝试将此内容粘贴到 .htaccess 文件中,它应该能够正常工作。

php_value post_max_size 2000M
php_value upload_max_filesize 2500M
php_value max_execution_time 6000000
php_value max_input_time 6000000
php_value memory_limit 2500M

你能再具体一点吗?它应该放在IfModule外面还是里面? 我已经将它粘贴在IfModule外面,但它给了我服务器错误。 - Alauddin Ahmed

13

post_max_size 应略大于 upload_max_filesize,因为当使用 HTTP POST 方法上传时,文本还包括文件大小和名称等头信息。

如果您想成功上传 1 GiB 文件,您需要设置:

upload_max_filesize = 1024M
post_max_size = 1025M

请注意,GB的正确后缀是G,即upload_max_filesize = 1G。

无需设置memory_limit


这就是拯救我的那个。 - Joe

7
在某些情况下,您需要增加最大执行时间。
max_execution_time=30

我做到了

max_execution_time=600000

然后我很开心。


8
通常你可能不想在php.ini中设置此项,因为这会允许所有的php进程在那段时间内运行。你可以在单个文件中使用set_time_limit()来设置它,例如 set_time_limit(600000)。 - billrichards

5

可能不止一个php.ini文件。例如,在使用WAMP时,以下目录中有2个php.ini文件:

  • C:\wamp\bin\apache\apache2.4.9\bin
  • C:\wamp\bin\php\php5.5.12

您需要编辑第一个。


5
我不太同意,但是在php.ini.htaccess中增加文件大小的解决方案无效,如果用户上传比服务器应用程序允许的更大的文件。

我建议在前端进行验证。例如:

$(document).ready(function() {
    $ ('#your_input_file_id').bind('change', function() {
        var fileSize = this.files[0].size/1024/1024;
        if (fileSize > 2) { // 2M
            alert('Your custom message for max file size exceeded');
            $('#your_input_file_id').val('');
        }
    });
});


3
不同意什么? - Rob
1
在客户端进行验证是可以的,但这并不能提高安全性,只是为了让用户在上传大文件时能够立即得到警告。我们的目标不是阻止用户上传大文件,而是允许他们上传大文件。 - Altimus Prime
1
这个问题没有服务器端的解决方案或检查吗?我可以轻松地绕过JS检查。 - akinuri
1
没事了,我想通了:if ($_SERVER["CONTENT_LENGTH"] > (int)(str_replace("M", "", ini_get("post_max_size")) * 1024 * 1024)) { // do w/e - akinuri

3
如果您正在使用Windows上的Wamp来使用Php 5.6.X版本,则文件位置可能在

C:\Windows\php.ini

只需尝试一下

post_max_size = 100M;

尝试在Apache one中进行更改。通过这样做,您的Wamp / XAMP会加载.ini文件。

0

如果您正在使用Laravel并使用artisan:serve运行Laravel项目,则可以在公共目录中创建php.ini,然后指定配置。

  • file_uploads = On
  • max_execution_time = 300
  • post_max_size = 20480M
  • upload_max_filesize = 20480M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接