javascript – IE iframe无法正确处理应用程序/ json响应

我目前正在使用ASP.NET Web API将ASP.NET MVC网站的某些部分升级为更加RESTful.我们正在转向更RESTful设计的功能之一是文件上传.对于客户端,我们使用 jquery插件 ajaxForm来包装iframe的创建,iframe将提交包含文件输入元素的表单.这对ASP.NET MVC很有用.

当更改它以使用我们的Web API端点(它返回Content-Type为“application / json”的响应)时,我们注意到Internet Explorer 9的问题.似乎从未调用过ajaxForm成功函数.据我所知,似乎IE中的iframe将Content-Type为“application / json”的响应正文解释为要下载的文件附件.这意味着它永远不会触发iframe的“已加载”事件,这意味着永远不会触发ajaxForm onload事件处理程序,并且永远不会调用我们的ajaxForm成功函数.

我们也注意到了IE 7中的问题,但是我们无法在最新版本的Firefox或Chrome中重新创建该问题,即使强迫他们使用iframe而不是使用FormData的File API.

为了解决此问题,我现在强制将响应Content-Type返回到“text / plain”,这是我们之前从处理文件上载的ASP.NET MVC控制器操作返回的内容.这使一切都恢复了.

我的问题:

>有没有办法可以将Web API响应Content-Type保持为“application / json”并让IE正确解释它?
>使用IE和Web API时是否有更好的文件上传方式?也许是一个不同的插件或更好的技术?

附加限制:我不能在本网站上使用ActiveX或Flash.我可以使用不同的插件,但前提是它具有一般的跨浏览器支持. (IE,Chrome,Firefox,Safari等)

我的HTML:

<form id="uploadFormId" action="" method="post" enctype="multipart/form-data" encoding="multipart/form-data">
    <input type="file" name="files[]"/>
</form>

我的javascript:

function onFileChange( e ) {
    if ( e.type === e.originalEvent.type ) {
        var filePath = $( e.currentTarget ).val();
        if ( filePath !== '' ) {
            $( this ).closest( 'form' ).submit();
        }
    }
};

$( function() {
    $( '#uploadFormId' ).ajaxForm( {
        url: "api/Files/1234",dataType: 'json',success: function ( response ) { 
            alert( response );
        },error: function ( xhr,status,error ) { 
            alert( status );
        }
    } );
    $( '#uploadFormId input[type="file"]' ).bind( 'change',onFileChange );
});

“application / json”响应头(在IE中不起作用):

Cache-Control:no-cache
Content-Length:337
Content-Type:application/json; charset=utf-8
Date:Wed,17 Jul 2013 13:10:47 GMT
Expires:-1
Pragma:no-cache
Server:Microsoft-IIS/8.0
X-AspNet-Version:4.0.30319
X-Powered-By:ASP.NET

“text / plain”响应头(适用于IE):

Cache-Control:no-cache
Content-Length:322
Content-Type:text/plain
Date:Wed,17 Jul 2013 13:17:24 GMT
Expires:-1
Pragma:no-cache
Server:Microsoft-IIS/8.0
X-AspNet-Version:4.0.30319
X-Powered-By:ASP.NET

解决方法

当ajaxForm使用iframe提交模式时,调用的响应必须在iframe的主体中呈现.这意味着它必须是浏览器可以呈现的内容类型 – 通常是HTML,但text / plain也可能正常工作.但是,浏览器无法将application / json呈现为页面.

使用text / plain也存在一个特定的问题,因为浏览器可能会内容嗅探它,并且如果在数据中看起来像HTML标记,则将资源视为HTML.如果您的JSON返回其中包含用户提供的数据,则可能允许某人将可执行JavaScript注入您的站点(XSS攻击).

正如ajaxForm doc所建议的,你应该检测到来自iframe帖子而不是AJAX的调用,并在这种情况下返回带有textarea包装器的text / html响应:

To account for the challenges of script and JSON responses when using the iframe mode,the Form Plugin allows these responses to be embedded in a textarea element and it is recommended that you do so for these response types when used in conjuction with file uploads and older browsers.

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...