【问题标题】:Upload 1GB files using chunking in PHP在 PHP 中使用分块上传 1GB 文件
【发布时间】:2011-01-27 17:12:57
【问题描述】:

我有一个网络应用程序,它接受最大为 4 MB 的文件上传。服务器端脚本是 PHP,Web 服务器是 NGINX。许多用户要求大幅提高此限制以允许上传视频等。

然而,PHP 似乎没有简单的解决方案来解决这个问题。首先,在客户端,我正在寻找可以让我在传输过程中对文件进行分块的东西。 SWFUpload 似乎没有这样做。我想我可以使用 Java FX (http://blogs.oracle.com/rakeshmenonp/entry/javafx_upload_file) 流式上传,但我在 PHP 中找不到任何等效的 request.getInputStream。

增加浏览器 client_post 限制或 php.ini 上传或max_execution 次并不是真正的大文件(~ 1GB)的解决方案,因为浏览器可能会超时并考虑存储在内存中的所有这些 blob。

有没有办法在服务器端使用 PHP 来解决这个问题?非常感谢您的回复。

【问题讨论】:

  • 我的一个应用程序允许通过配置您提到的相同服务器端选项来上传 > 1 GB 的文件。用户从未报告过超时或类似情况。
  • 一个好的解决方案无处不在,恕我直言。在 56 KBPS 调制解调器/慢速连接上无法上传 1GB 文件。分块解决方案将非常强大,并且可以支持恢复中断的链接。
  • 看这里:tus.io

标签: php upload large-files


【解决方案1】:

你可以使用this package

它支持可恢复的块上传。

examples/js-examples/resumable-chunk-upload 示例中,您可以关闭并重新打开浏览器,然后继续未完成的上传。

【讨论】:

    【解决方案2】:

    查看tus protocol,这是一个基于 HTTP 的可恢复文件上传协议,因此您可以从上次中断的地方继续,而无需重新上传整个数据,以防出现任何中断。从 2017 年 5 月起,该协议也是 adopted by vimeo

    您可以找到不同语言的协议的各种实现here。在您的情况下,您可以使用名为 uppy 的 JavaScript 客户端,并在服务器中使用基于 golangphp 的服务器实现。

    【讨论】:

    【解决方案3】:

    尝试使用bigupload 脚本。它非常易于集成,最多可以分块上传 2 Gb。块大小是可定制的。

    【讨论】:

    【解决方案4】:

    plupload 是一个 javascript/php 库,它非常易于使用并允许分块。

    不过它使用 HTML5。

    【讨论】:

    • 值得一提的是同时它还支持HTML4、Silverlight和Flash,可以看到here
    【解决方案5】:

    我创建了一个 JavaFX 客户端以发送最大帖子大小的块(我使用 2 MB)和一个 PHP 接收器脚本来将这些块组装成原始文件。我在这里发布 apache 许可下的代码:http://code.google.com/p/gigaupload/ 随意使用/修改/分发。

    【讨论】:

    • 如果这是解决您问题的方法,请不要犹豫,将其标记为答案 ;-)
    【解决方案6】:

    如何使用 java 小程序进行上传和 PHP 处理..

    您可以在此处找到 Jupload 的示例: http://sourceforge.net/apps/mediawiki/jupload/index.php?title=PHP_Example

    【讨论】:

    • 感谢您的链接。这应该是可能的,我现在正在尝试使用 Java FX。 J上传大约 10 年前的截图;o)
    • 哈哈,我不确定 :) 但是 PHP 代码是最近的..(几天前最后一次更新)你可以看到他们是如何进行分块的..jupload.svn.sourceforge.net/viewvc/jupload/trunk/wwwroot/…
    【解决方案7】:

    "但是我在 PHP 中找不到任何等效的 request.getInputStream。"

    fopen('php://input'); 或许?

    【讨论】:

    • 没有 php://input 用于多部分表单数据
    【解决方案8】:

    您绝对可以编写一个接受数据块(甚至通过 POST)的 Web 应用程序,然后将该数据块附加到文件中。在我看来,您需要某种客户端应用程序来获取文件并将其分解为多个块,然后一次将其发送到您的 Web 服务。然而,创建一个 sftp 目录似乎要容易得多,让客户端只需使用一些预先存在的客户端应用程序来 sftp 上传文件。

    【讨论】:

    • 您可能不想在每个块进入时将它们附加到目标文件。这些块可能会乱序。我们使用的解决方案是使用数字 id 保存每个块,然后在所有块都上传后合并所有块。
    猜你喜欢
    • 2011-04-19
    • 1970-01-01
    • 2017-01-08
    • 2016-03-19
    • 2010-12-08
    • 2021-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多