4GB HTTP文件上传使用jQuery-File-Upload,Apache和PHP

时间:2012-11-26 22:52:28

标签: php jquery-plugins file-upload apache2

这个问题似乎与臭名昭着的2GB限制直接相关,我不确定这个问题是否是32位PHP问题。 我已经看到与HTTP相关的注释不是为这样的大文件设计的。 但是,在决定对迄今为止已证明有效的方法进行任何根本改变之前,我宁愿用尽这个方向。 由于标题建议我需要上传> 2GB文件,迄今为止最大的3.8GB。 我有一个使用jQuery-file-upload构建的表单,在这些大文件启动之前发送任何文件(都小于< 2GB)都没有问题。 3.8GB一个从File-Upload上传可能需要5分钟,进度条完成100%。 但是,上传后报告的错误是类型1,表明文件大小限制已被破坏。

如果我在上传过程中监控服务器上的磁盘使用情况,它将具有以下示例属性: 在上传之前,磁盘使用了30%,随着上传的继续,这种使用率增加了31%,32%...... 45%,46%等。 但是,在2GB点附近,当客户端/浏览器文件上传继续时,磁盘使用率会下降到30%。 当服务器磁盘使用量停止增加时,客户端可能只占上载的60%。 然而,客户端仍然继续100%但服务器不接受,因为磁盘状态永远不会移动30%。

我正在使用Apache / 2.2.22(Ubuntu)和PHP版本5.3.10-1ubuntu3.2运行64位Ubuntu(最新版本) 经过多天打开和关闭搜索解决方案后,我仍然无法在更改这么多设置后上传3.8GB文件。 我将在下面列出一些变化,但在这个阶段我认为这可能是一个32位的PHP问题,所以如果有人可以建议值得关注的链接或解决方案值得尝试,我会很感激。

在Apache2中,我设置了以下内容:

- apache2.conf I've set Timeout to 900
- httpd.conf I've set LimitRequestBody to 0
- .htaccess in the file upload directory I've set:
    - LimitRequestBody to 4939212390
    - php_value upload_max_filesize 4831838208
    - php_value post_max_size 4939212390

在php.ini中我设置了以下内容:

- UPLOAD_MAX_FILESIZE 4831838208
- POST_MAX_SIZE 4939212390
- max_execution_time 120
- max_input_time 60
- memory_limit 128M

如果我在服务器上运行以下内容,那么PHP似乎没有32位问题,但我现阶段不确定。

php -r "echo PHP_INT_MAX;"
9223372036854775807

正如我所提到的,任何想法都会受到高度赞赏。

更新:

已经解决了这个问题,所以感谢@BogdanBurim建议回归基础方法:

我已设法通过HTTP上传3.8 GB文件,其中包含以下设置:

在Apache2中,我设置了以下内容:

- apache2.conf I've set Timeout to 900
- httpd.conf I've set LimitRequestBody to 0
- .htaccess in the file upload directory I've set:
    - LimitRequestBody to 0
    - php_value upload_max_filesize 0
    - php_value post_max_size 4939212390
- .htaccess in the php temp directory (in my case its /tmp/) I've set:
    - LimitRequestBody to 0
    - php_value upload_max_filesize 0
    - php_value post_max_size 4939212390

在php.ini中我设置了以下内容:

- UPLOAD_MAX_FILESIZE 0
- POST_MAX_SIZE 4939212390
- max_execution_time 120
- max_input_time 60
- memory_limit 128M

此解决方案唯一的另一个重要部分是必须从上传表单中删除MAX_FILE_SIZE,HTML:

<input type="hidden" name="MAX_FILE_SIZE" value="4939212390" />

持续导致此类设置导致PHP类型2错误,因此php无法处理设置的大于32位的整数。 删除它会导致PHP类型1错误,直到我将UPLOAD_MAX_FILESIZE更改为0到处都是,并且它现在可以正常运行!!!!

http://php.net/manual/en/features.file-upload.errors.php

3 个答案:

答案 0 :(得分:6)

已经解决了这个问题,所以感谢@BogdanBurim建议回归基础方法:

我已设法通过HTTP上传3.8 GB文件,其中包含以下设置:

在Apache2中,我设置了以下内容:

- apache2.conf I've set Timeout to 900
- httpd.conf I've set LimitRequestBody to 0
- .htaccess in the file upload directory I've set:
    - LimitRequestBody to 0
    - php_value upload_max_filesize 0
    - php_value post_max_size 4939212390
- .htaccess in the php temp directory (in my case its /tmp/) I've set:
    - LimitRequestBody to 0
    - php_value upload_max_filesize 0
    - php_value post_max_size 4939212390

在php.ini中我设置了以下内容:

- UPLOAD_MAX_FILESIZE 0
- POST_MAX_SIZE 4939212390
- max_execution_time 120
- max_input_time 60
- memory_limit 128M

此解决方案唯一的另一个重要部分是必须从上传表单中删除MAX_FILE_SIZE,HTML:

<input type="hidden" name="MAX_FILE_SIZE" value="4939212390" />

持续导致此类设置导致PHP类型2错误,因此php无法处理设置的大于32位的整数。 删除它会导致PHP类型1错误,直到我将UPLOAD_MAX_FILESIZE更改为0到处都是,并且它现在可以正常运行!!!!

http://php.net/manual/en/features.file-upload.errors.php

答案 1 :(得分:0)

如果您有权访问apache virtualhost配置,您还可以更改特定上传URL的这些设置(您也可以将其添加到.htaccess文件中):

使用此代码:

<LocationMatch "/index.php/url-of-your-upload.php">
    php_value max_execution_time 0
    php_value upload_max_filesize 0
    php_value post_max_size 4939212390
    php_value memory_limit 4G
    LimitRequestBody 0
</LocationMatch>

LocationMatch指令允许您选择URL(您可以使用reg exp)

答案 2 :(得分:-7)

问题是为什么要使用浏览器上传&gt; 1GB。考虑顶级文件共享服务,大多数通过浏览器将文件上载大小限制为1GB。如果用户下载失败会发生什么,您将不得不重新启动整个过程。

如果您有大量文件上传,种子,ftp或个人上传客户端(如rapidshare,fileupload,megaupload等),您是否已查看替代方案。

由于文件大小限制设置为POST,因此您受到限制。如果您决定使用HTTP上传我不鼓励的更大的文件,最佳解决方案是拆分文件并上传较小的拆分部分,然后重新组装文件。