【问题标题】:4GB HTTP File Uploads Using jQuery-File-Upload, Apache and PHP使用 jQuery-File-Upload、Apache 和 PHP 上传 4GB HTTP 文件
【发布时间】:2012-11-26 22:52:27
【问题描述】:

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

如果我在上传期间监控服务器上的磁盘使用情况,它将具有以下示例属性: 在上传之前,磁盘使用了 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

【问题讨论】:

  • 尝试用简单的 HTML 表单和 上传文件。它会崩溃吗?您可能会看到确切的错误消息。
  • 谢谢@BogdanBurim 我稍后再试一下并更新

标签: php jquery-plugins file-upload apache2


【解决方案1】:

已经解决了这个问题,感谢@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

【讨论】:

  • 您是否在所有浏览器版本(IE 7+ 和 FF12+)中进行了测试,是否在所有这些浏览器中都有效?使用简单的HTML&lt;input type="FILE" .. 有什么不同吗?我的意思是,它会影响视频上传吗?我们也在尝试实现视频上传,但是我们的应用Stack if Java & Struts。
  • @VikasV 我还没有在任何 IE 平台上测试它,但现在你问它会做。它在 FF 和 CH 上运行良好,但问题从来不是我的客户端浏览器。在 FF 和 CH 中如果发送文件但总是报告服务器端 2GB+ 文件的部分文件上传问题,已按照上述设置为我修复。
  • LimitRequestBody 在Apache 2.4 中默认为0(无限制),可能还有其他版本。
【解决方案2】:

如果您有权访问 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)

【讨论】:

  • 将它放在我的 .htaccess 文件中时出现 500 错误。
【解决方案3】:

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

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

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

【讨论】:

  • "如果用户下载失败会发生什么情况,您将不得不重新启动整个过程。" emmm,不是吗? w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.16
  • 是的,效果很好,但最终会损坏文件。用这种方式上传这么大的文件是愚蠢的。
  • 感谢@kellax,但问题的重点是要详尽了解有关该问题的信息。它也与下载无关。如果您可以找到 POST 限制的确凿证据,请链接到我在客户端或服务器上下文中找不到的任何内容。此外,jQuery-File-Upload 在 Chrome 或 Firefox 浏览器中处理 3.8GB 文件没有问题,这似乎没有浏览器问题。 (当firebug运行时,Firefox会在这么大的文件上崩溃,但除此之外很好,顺便说一句)。最后,愚蠢是无关紧要的,在这个 >2GB 的要求之前,这个过程一直运行良好。
猜你喜欢
  • 2020-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-02
  • 2016-05-13
  • 2018-06-01
  • 2017-08-16
  • 2016-01-08
相关资源
最近更新 更多