【问题标题】:AJAX Uploading - Not waiting for response before continuingAJAX 上传 - 在继续之前不等待响应
【发布时间】:2025-12-08 03:20:19
【问题描述】:

我正在使用Blueimp's jQuery Uploader(非常好,这也是顺便说一句)和一个 S3 处理程序来上传文件,然后通过 S3 API(来自 PHP SDK)将它们传输到 S3。

它有效。问题是,对于 文件 (>1GB),将任何内容传输(通过 create-object)到 S3 可能需要 几分钟。执行此操作的 PHP 文件将挂起,直到此过程完成。问题是,上传者(使用jQuery Ajax method)似乎每次都放弃等待并重新开始。

我认为这与 PHP INI 'max_input_time' 等有关,因为它似乎等待了大约 60 秒,尽管现在似乎有所不同。我已经提高了 PHP INI 和其他相关的 max_input_time - 但没有进一步。

我还考虑过(更有可能)脚本或 jQuery 方法中的 JS 有超时。开发人员(blueimp)说前端脚本中没有这样的超时,我也没有看到任何超时,虽然在 jQuery Ajax 方法选项中引用了“超时”,但它似乎影响了它上传的整个时间而不是等待回复 - 所以这没什么用。

感谢您提供任何帮助或指导。

【问题讨论】:

  • 所以问题是从浏览器通过 PHP 上传到 S3 需要几分钟;或者上传从浏览器到 PHP,在那里它们被暂存,然后从 PHP 到 S3;还是从服务器上传到 S3,而浏览器只是在监视作业?
  • offtopic:我发现制作像 blueimp 这样的文件上传器比理解和编辑 blueimp 容易得多
  • @jcolebrand 从服务器端的 PHP 到 S3 的传输需要几分钟时间 - 前端脚本在完成之前没有响应,因此他们认为它失败并重新启动。
  • 那么为什么不把它分为两步呢?投票操作肯定不需要复杂的东西吗?上传时向文件写入状态消息,并轮询该文件的更改?
  • 当然可以。我试图一次性解决它,因为第二个过程并不复杂,而是另一个潜在的故障点,如果它可以解决 - 我会的。纳达,我会继续努力的。

标签: php javascript jquery ajax upload


【解决方案1】:

jQuery 文档http://api.jquery.com/jQuery.ajax/ 说:

超时

为请求设置超时(以毫秒为单位)。这将覆盖 使用 $.ajaxSetup() 设置的任何全局超时。超时时间开始 在进行 $.ajax 调用时;如果有其他几个请求 进度和浏览器没有可用的连接,有可能 请求在发送之前超时。在 jQuery 1.4.x 和 下面,XMLHttpRequest 对象将处于无效状态,如果 请求超时;访问任何对象成员可能会抛出一个 例外。仅在 Firefox 3.0+ 中,脚本和 JSONP 请求不能 因超时取消;即使脚本在之后到达,它也会运行 超时时间。

除此之外,检查 php set_time_limit 函数和 php max memory 设置可能也是一个好主意。

无论如何,在我看来最好的方法是像这样实现错误回调

$.ajax('yourScript.php',{
 error:function(jqXHR){  echo this error ... }
});

jQuery 文档说:

错误回调按照注册的顺序被调用,如果 请求失败。他们收到 jqXHR,一个指示错误的字符串 类型和异常对象(如果适用)。一些内置错误会 提供一个字符串作为异常对象:“abort”、“timeout”、“No 运输”。

这可能会提示您是谁(服务器或客户端)停止了传输。

希望对你有帮助

【讨论】:

  • 不报错,真是头疼。我认为进度报告中有些东西完全从头开始会被搞砸。
【解决方案2】:

一次性上传大文件可能会导致各种问题。最好的做法是在客户端将文件拆分成块,然后将它们发送到服务器,一次一个块,并让服务器将这些块重新组合成原始文件,然后再将其推送到 S3。

只要您可以使用window.FileReaderFile.prototype.slice,您就可以在文件上使用javascripts .split() 来剪切它。

【讨论】:

  • 这听起来很狡猾,依靠客户端浏览器来分割文件,然后希望能正确重组——这似乎不是一个非常成熟的做法?