我在实际的EXTJS版本上创建了一个文件上传到我的服务器。如果文件上传成功,后端会创建一个json响应,以便在前端进行处理。在Chrome和Firefox上,它工作得很好,但在IE上,它总是将json响应作为文件下载并中断进程,你知道如何在IE上防止这种情况吗?
感谢
请告诉我。你使用的是什么版本。我使用的是extjs 3.4文件,在所有浏览器中上传它的工作文件。
new Ext.form.FormPanel({
fileUpload : true,
items:[new Ext.form.TextField({
id:"iconUpload",
fieldLabel: 'Image',
inputType: 'file',
name: 'appIcon'
})],
listeners : {
render : function(form){
}
},
buttonAlign: 'center',
buttons: [{
text : 'Submit',
formBind : true,
handler : function(){
itemPanel.getForm().submit({
waitMsg: "Progress ...",
success: function(form, action){
},
failure: function(form, action){
}
});
}
}]
});
所以我找到了解决方案,问题是内容类型。通常我使用json响应,但IE8和IE9有问题,所以你必须发送一个"text/html"内容类型来解决这个问题
MartinMB的答案基本上是正确的。这个答案旨在提供更多的背景信息。
在ExtJS中,文件上传不是使用普通的Ajax技术执行的,也就是说,它们不是使用XMLHttpRequest执行的。相反,会临时创建一个包含所有字段的隐藏元素,并将其目标设置为引用动态生成的隐藏元素来提交,该隐藏元素会插入到文档中,但在收集返回数据后会被删除。
浏览器解析服务器响应,为IFRAME创建文档。如果服务器使用JSON发送返回对象,则必须将Content-Type
标头设置为text/html
,以便告诉浏览器将未更改的文本插入到文档正文中。
Chrome、FF、IE10和更高版本在响应标头中看到Content-Type
=application/json
时会执行此操作。然而,当你对IE8和IE9执行此操作时,当服务器从文件上传中响应时,你会看到一条消息,内容大致如下:"你想打开还是保存此文档"?
所以,要在IE8和IE9中解决这个问题,只需执行Content-Type
到text/html
即可。现代浏览器的响应是一样的,所以这个解决方案不会破坏任何东西。