大文件上传时,POST数据丢失

7
我在我的PHP应用程序中使用文件上传工具时遇到了问题。当发送大文件(9MB+)时,我会遇到一个非常奇怪的行为:我在表单中包含的POST数据消失了,包括文件信息。
我已经尽可能地增加了所有PHP限制(时间限制、最大输入时间、POST最大大小、内存限制和上传最大文件大小),但仍然无法得到正确的行为。我尝试用基于Flash的解决方案(SWFUpload,www.swfupload.org)替换常规HTTP表单,但仍然出现相同的行为。
我尝试了多个大小相似的文件,这绝不是特定文件的问题。我使用Firebug调试发送的POST变量,正确的变量仍然在头部与文件一起存在。
这里可能出了什么问题?

1
不妨查看服务器日志,试图发现任何错误/警告。 - nc3b
我遇到了同样的问题。你解决了吗? - Pherrymason
服务器日志应该可以给你一个想法。如果可用的话,还要查看PHP错误日志。 - Salman A
4个回答

2

好的,我认为我有解决方法。 您必须同时检查post_max_size指令和$_SERVER ['CONTENT_LENGTH'],因此如果$_SERVER ['CONTENT_LENGTH']超过了post_max_size,那么意味着他们试图上传太多数据。

$POST_MAX_SIZE = ini_get('post_max_size');
$mul = substr($POST_MAX_SIZE, -1);
$mul = ($mul == 'M' ? 1048576 : ($mul == 'K' ? 1024 : ($mul == 'G' ? 1073741824 : 1)));
if( $_SERVER['CONTENT_LENGTH'] > $mul*(int)$POST_MAX_SIZE && $POST_MAX_SIZE )
{
    $error = true;
}

以下解决方案取自这里:http://www.php.net/manual/en/features.file-upload.php#73762


2

Web服务器也可以配置限制请求大小。如果您使用的是Apache,请查看LimitRequestBody指令。


我查看了Apache配置,发现LimitRequestBody指令不存在,因此我认为它处于默认值(0或无限制)状态。 - DfKimera
原来这就是问题所在。除了当时我使用的 WHM/cPanel 设置使得真正更改 LimitRequestBody 指令变得非常困难。提高这个值 + post_max_size、上传文件大小和内存限制应该可以解决这个问题。 - DfKimera
我已经尝试更改post_max_size、upload_max_size和内存限制,但仍然面临相同的问题。 - Kapil Agrawal

1

尝试上传大小为1-2 MB的小文件。如果仍然无法发布代码,请检查表单定义中是否已添加enctype='/multipart/form-data'。


我已经尝试过,小文件可以正常工作。但问题会在8MB以上的文件出现。 Enctype是存在的。 - DfKimera

0
你在运行哪个服务器?我认为一些服务器操作系统有设置允许的文件大小限制。这个值是可以改变的。

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