gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 05:10:27 26 4
gpt4 key购买 nike

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

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

我们也注意到了 IE 7 中的问题,但我们无法在最新版本的 Firefox 或 Chrome 中重现该问题,即使强制它们使用 iframe 而不是 FormData 的文件 API 也是如此。

为了暂时解决这个问题,我现在强制响应内容类型返回“text/plain”,这是我们之前从处理文件上传的 ASP.NET MVC Controller 操作返回的内容。这让一切都恢复正常。

我的问题:

  • 有没有办法让 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”响应 header (在 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”响应 header (在 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的body中。这意味着它必须是浏览器可以呈现的内容类型——通常是 HTML,但 text/plain 也可以工作。但是,浏览器无法将 application/json 呈现为页面。

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

根据 ajaxForm doc 的建议您需要检测调用何时来自 iframe post 而不是 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.

关于javascript - IE iframe 无法正确处理应用程序/json 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17701992/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com