7

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

有用。问题是,在文件(>1GB)上,将(通过创建对象)传输到 S3可能需要几分钟的时间。执行此操作的 PHP 文件将挂起,直到此过程完成。问题是,上传者(它使用jQuery Ajax 方法)似乎每次都放弃等待并重新开始。

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

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

感激地收到任何帮助或指导。

4

2 回答 2

1

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

只要您可以使用window.FileReader并且可以在文件上File.prototype.slice使用 javascripts.split()来剪切它。

于 2012-11-29T17:03:47.400 回答
1

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

暂停

为请求设置超时(以毫秒为单位)。这将覆盖使用 $.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 Transport”。

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

希望这可以帮助

于 2012-11-29T17:02:19.737 回答