【问题标题】:Upload very large files(>5GB)上传非常大的文件(>5GB)
【发布时间】:2012-10-18 19:15:20
【问题描述】:

我需要你的帮助。我想用 HTML、JQuery 和 PHP 创建一个上传脚本。 是否可以编写一个脚本,可以上传非常大的文件(> 5 GB)?

我已经尝试使用 FileReader、FormData 和 Blobs,但即使使用这些,我也无法上传大文件(我的浏览器在选择大文件后崩溃)。

PS:我想自己写。不要发布任何已完成的脚本。

问候

【问题讨论】:

  • 听起来您可能不了解问题的范围。您应该使用或至少从现有系统开始,如果您必须要求 SO 开始使用此系统,您将无法自拔。典型的例子是浏览器崩溃作为开箱即用的行为。
  • 5GB 通过网络服务器?嗯。听起来像是不适合这项工作的工具。
  • 5GB 超出浏览器上传的规模。
  • @user1515190 不……你不完全理解。您最后一次在 Web 浏览器中下载(比上传更佳)一个 5GB 文件或在没有适合处理大文件的内存管理的程序中打开一个文件是什么时候。这不是从一个小文件线性增加的工作量。
  • 你需要的时候哪里有megaupload...?

标签: php jquery upload blob filereader


【解决方案1】:

是的。一年前我写了 PHP 来上传 5GB 以上的文件。

FileReader、FormData 和 Blob 将失败,因为它们都需要在上传之前进行预处理并在 javascript 中转换。

但是,您可以使用简单的 XMLHttpRequest 轻松上传大文件。

var xhr=new XMLHttpRequest();
xhr.send(document.forms[0]['fileinput']);

这不是标准或文档化的方式,但是,很少有 Chrome 和 Firefox 支持。但是,它按原样发送文件内容,而不是 multipart/form-data,而不是 http form-data。 您需要准备自己的 http 标头以提供更多信息。

var xhr=new XMLHttpRequest(), fileInput=document.forms[0]['fileinput'];
xhr.setRequestHeader("X-File-Name", encodeURIComponent(getInputFileName(fileInput)));
xhr.setRequestHeader("X-File-Size", getFileSize(fileInput));
xhr.send(fileInput);

PS。好吧,实际上它不是 PHP。它是 PHP 和 Java Servlet 的混合体。

【讨论】:

  • 我尝试运行您的代码但失败了。我有一个带有文件输入名称文件的表单并尝试了 xhr.send(document.forms[0].file);还有 xhr.send(document.forms[0].['file']);但出现“xhr.send 不是函数”错误。以及在哪里添加目标脚本?将 xhr.open('POST', 'upload.php', true); var xhr 声明后是否正确?
【解决方案2】:

问题是,它并不实用。首先你有一个问题,当你遇到浏览器问题时,你必须重新开始上传。当您上传大文件时,可能会发生这种情况。

这是另一个使用 Ajax 的解决方案:

php uploading large files
AX-JQuery Uploader

【讨论】:

    【解决方案3】:

    查看“chunking”,可能使用像AX Ajax multi uploader 这样的插件,它应该有助于客户端和服务器端文件大小限制。

    【讨论】:

    • Ajax 多重上传链接已损坏。
    【解决方案4】:

    请记住,调整您的 PHP.ini 变量(与脚本计时有关)非常重要,称为每个脚本的最大执行时间,以秒为单位 max_execution_time = xxxx 以防止您的脚本不会超时,因为您知道上传大文件非常耗时。还要检查变量max_input_time = xxxx,这是每个脚本可能花费在解析请求数据上的最长时间。最好在生产服务器上限制此时间,以消除意外长时间运行的脚本,但在您的情况下,您可能需要增加它。 还考虑更改以下变量memory_limit、upload_max_filesize、post_max_size

    【讨论】:

      【解决方案5】:

      我不认为 5gb+ 类型的文件会考虑网络上传,或者浏览器会愉快地传输这种信息。文件系统限制也是一个问题。您应该根据使用场景考虑/重新考虑文件上传。网络是唯一的选择吗? FTP、流式传输、远程转储可能是更好的解决方案,在传输时不会阻止您的网络服务器/网页。 HTTP 不是最好的协议。

      认为浏览器、PHP 和 Apache 它们的内存都是有限的。当 chrome 每页使用超过 250 MB(这不正常)时,我的防病毒软件会向我发出警告。 PHP 有一个默认的 128 MB 专用内存,想象一下有 100 个 Apache 用户同时上传 5GB 文件。这就是他们发明 FTP 的原因。

      为什么你认为这些限制存在于 PHP、apache... 中?因为是一种攻击方式,一个安全问题和一种阻止服务器的方式,可以很容易地被......每个人利用。

      【讨论】:

      • 当然 http 不是处理大文件的方法 +1
      • 为什么不呢?甚至有些人也相信 http 是最好的,并且已经为一切做好了准备。来自经典的 Webservice/RESTful、Chrome OS、node.js 等等。
      猜你喜欢
      • 2012-06-13
      • 1970-01-01
      • 1970-01-01
      • 2012-07-31
      • 2014-10-10
      • 2016-01-29
      • 2021-02-12
      • 2019-12-30
      • 1970-01-01
      相关资源
      最近更新 更多