jquery文件上传 - IE完成回调data.result问题

CLo*_*Lod 30 jquery plugins internet-explorer file-upload

我正在使用jQuery文件上传插件.

我不使用该UI部分,只使用基本部分.

当我执行以下操作时,我遇到了以下问题IE:

$('input#fileupload').fileupload({
    url: '/upload',
    done: function (e, data) {
    if(data.result != null && $.trim(data.result) != '')
        $('a#attachment').html(data.result);
    }
    //......................
Run Code Online (Sandbox Code Playgroud)

IEdata.resultObject(IE9至少,不知道其他人......)

On Chrome/ Firefox只是响应Text(来自服务器的简单纯文本).

想法?

Jus*_*tin 50

我刚遇到同样的问题,我认为这是因为IE(甚至9)不支持XHR文件上传.以下是我认为正在发生的事情以及我的解决方案:

由于Safari 5 +,Firefox 4+和Chrome支持XHR文件上传,因此fileupload插件可以异步传输文件,从而允许来自服务器的纯文本响应.这个纯文本响应是经由提供data.resultdone事件处理程序,并且可以容易地使用.

在IE中,然而,文件传输通过一个隐藏的iframe刷新整个页面出现,导致data.resultdone处理程序是一个完整的document对象,具有响应文本包裹内心深处<html><body><iframe><pre>的标签.

这不仅使得在IE中获取数据变得很痛苦,而且它使您获得浏览器之间不同数据的方式.

我的解决方案

我将forceIframeTransport选项设置为true,这使得所有浏览器都使用隐藏的iframe传输文件,例如IE.遗憾的是错过了XHR文件上传,但至少在所有浏览器中都给出了相同的响应.然后,在我的done处理程序中,我从document对象中提取结果,如下所示:

var result = $( 'pre', data.result ).text();
Run Code Online (Sandbox Code Playgroud)

在你的情况下,我认为代码看起来像这样:

$('input#fileupload').fileupload({
    forceIframeTransport: true,
    url: '/upload',
    done: function ( e, data ) {
     var result = $( 'pre', data.result ).text();
     if( result != null && $.trim( result ) != '' )
        $( 'a#attachment' ).html( result );
    }
...
Run Code Online (Sandbox Code Playgroud)

此处还需要注意的是,我服务器的响应的内容类型是"text/plain".您可能已经注意到,IE有时会提示用户保存或打开json响应.

以下是一些在解决问题时证明有用的链接:https: //github.com/blueimp/jQuery-File-Upload/wiki/Browser-support(请参阅底部的"XMLHttpRequest"部分) https://github.com/blueimp/jQuery-File-Upload/wiki/Options(参见'forceIframeTransport'约1/3)

希望这有帮助!

  • 很好的答案 - 谢谢.关闭所有浏览器的XHR上传的替代方法是在done方法中测试结果以获得适度降级,例如:`var html; if(data.result [0] .body){html = data.result [0] .body.innerHTML; } else {html = data.result; }` (14认同)
  • 我试图使插件在IE中工作,并在完成回调中获得未定义的结果.有任何想法吗? (2认同)

小智 13

我遇到了与上面提到的类似的问题,并发现将响应类型更改application/jsontext/plain修复这些问题.


小智 5

实际上这就是jquery.iframe-transport.js它的用途(基本版本还包括这个插件作为附加参考).你需要的是将dataType属性设置为json,jquery.iframe-transport插件将自动解析iframe结果,因此你可以在done处理程序中使用相同的逻辑.

$('#fileupload').fileupload({
...
    dataType: 'json'
...
});
Run Code Online (Sandbox Code Playgroud)