蓝色冲击jQuery文件上传 - "done","complete"回调在IE 9中无法工作

14

我正在使用Blueimp Jquery File Upload插件进行文件异步上传。除了一些小问题外,在大多数其他浏览器中都运行良好,但是在IE中,我遇到了这个问题:无法调用“done”,“stop”,“always”,“complete”和一些其他事件回调函数。

在调试时,我在“done”,“fail”,“always”中添加了console.logs,还在_onSend函数中的ajax请求中添加了“complete”方法(在jquery.fileupload.js中)- 但似乎在IE中没有任何一个方法被调用。

_onSend: function (e, data) {
        var that = this,
            jqXHR,
            slot,
            pipe,
            options = that._getAJAXSettings(data),
            send = function (resolve, args) {
                that._sending += 1;
                jqXHR = jqXHR || (
                    (resolve !== false &&
                    that._trigger('send', e, options) !== false &&
                    (that._chunkedUpload(options) || $.ajax(options))) ||
                    that._getXHRPromise(false, options.context, args)
                ).complete(function (result, textStatus, jqXHR) {
                    console.log("complete"); 
                }).done(function (result, textStatus, jqXHR) {
                    console.log("done", result); 
                }).fail(function (jqXHR, textStatus, errorThrown) {
                    console.log("fail", result); 
                }).always(function (a1, a2, a3) {
                    console.log("done", result); 

                   }
                });
                return jqXHR;
            };

[为了便于阅读,插件代码已经被删减]

我知道在IE9中,使用jquery.iframe-transport.js进行文件上传(因为IE不支持XHR文件上传)。

我不确定应该如何解决/调试这个问题。

谢谢!

3个回答

19

当从服务器返回json数据时,如果响应的content-type设置为"text/html"或"text/plain"而不是"application/json",则会触发done事件。这仅适用于不支持XHR文件上传(如IE9)且blueimp插件正在使用IFrame传输的浏览器。

与“内容协商”相关的信息可以在插件文档的“设置”部分找到: https://github.com/blueimp/jQuery-File-Upload/wiki/Setup


1
我们如何在Rails应用程序上实现这个? - CanCeylan
@CanCeylan:使用render :text => { ... }.to_json代替render :json => { ... }。 - mkk
@tanushree,感谢您抽出时间写下这个回复。它解决了我一直在调试的问题。 - PhysX
@PhysX 很高兴能够帮到你!我也花了相当长的时间来解决这个问题。 - tanushree
我正在使用“render partial: 'partial_name' and return”渲染一个“js.haml”局部视图,但在IE 8和9中,blueimp无法工作。它可以在IE 10中正常工作。当在IE 8/9中提交图像时,“formData”属性不在params中,因此出现问题。有人能帮我解决这个问题吗? - Swapnil Chincholkar
请注意,根据文档,在JSON响应包含“error”属性的情况下(您所描述的情况),done回调也会被调用。https://github.com/blueimp/jQuery-File-Upload/wiki/Options#done - Epoc

6

记录一下,当我直接上传到S3时遇到了这个问题,现在他们的CORS功能允许这样做。

解决方法是将success_action_status设置为“200”,然后Done事件就会被正确触发。


1
如果有人仍然在使用直接上传到S3时遇到此问题,解决方法是添加一个值为“201”的success_action_status字段。确保将其包含在策略数据中,因为它们必须匹配。
显然,在从IE9接收上传时,S3会返回一个空字符串。为了让它返回文件上传器需要的XML,您必须告诉它返回状态201。

你能解析XML结果吗?我需要获取上传文件的键名,我可以在XML响应中看到它,但是使用“done”方法时,“data.result”未定义。似乎是由于这个原因 - https://github.com/blueimp/jQuery-File-Upload/wiki/Cross-domain-uploads#cross-site-iframe-transport-uploads。知道任何解决方法吗? - Chris
@chris,我已经有一段时间没有看过这个了,我不确定我是否完全理解你所看到的问题。但是我刚刚检查了我的代码,并且在 on('fileuploaddone', function(e, data) {...} 回调中像这样访问上传:**file = data.files[0]**。 - hraynaud

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接