AJAX上传 - 在继续之前不等待响应

时间:2012-11-29 16:48:01

标签: php javascript jquery ajax upload

我正在使用Blueimp's jQuery Uploader(非常好,它太btw)和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 - 但没有更进一步。

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

感激不尽的任何帮助或指导。

2 个答案:

答案 0 :(得分: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内存设置也可能是个好主意。

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

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

jQuery文档说:

  

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

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

希望这有帮助

答案 1 :(得分:1)

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

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