14

这个问题似乎与臭名昭著的 2GB 限制直接相关,我不确定它是否是 32 位 PHP 问题。我已经看到与 HTTP 相关的评论不是为如此大的文件设计的。但是,在决定对迄今为止已证明有效的方法进行任何根本性改变之前,我宁愿用尽这个方向。正如标题所示,我需要上传 >2GB 的文件,迄今为止最大的 3.8GB。我有一个使用 jQuery-file-upload 构建的表单,在这些大文件开始之前,它发送任何文件(全部小于 <2GB)都没有问题。从 File-Upload 上传 3.8GB 可能需要 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

4

3 回答 3

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

于 2012-11-29T16:39:20.387 回答
0

如果您有权访问 apache 虚拟主机配置,您还可以更改特定上传 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)

于 2013-11-05T09:52:32.290 回答
-7

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

如果您有如此大的文件上传、种子、ftp 或个人上传客户端(如 rapidshare、fileupload、megaupload 等),您是否考虑过替代方案。有。

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

于 2012-11-26T23:04:37.687 回答