我正在使用this plugin(只是基本版本)并且正在利用所有简洁的功能进行更新以使用我自己的UI(使用Knockout.js和Twitter Bootstrap)。以下是上下文的一些代码片段:
// The file is sent to an ASP.NET MVC Web Api service to do all the business logic/DB stuff
uploadUrl = http://web.api.url/?apikey=key
$("#fileUpload" + "@index").fileupload({
headers: {
'Authorization': "@Html.AccessToken()",
'Accept': $.support.ajax ? "application/json" : "text/plain"
},
url: uploadUrl,
add: function (e, data) {
$.each(data.files, function (index, file) {
// add to KO viewmodel
});
data.submit();
},
fail: function (e, data) {
var error = data.errorThrown;
var text = data.textStatus;
},
done: function (e, data) {
// do some more viewmodel operations
},
progress: function (e, data) {
var progressPercentage = parseInt(data.loaded / data.total * 100, 10);
// update viewmodel
}
});
#fileUpload<Index>
元素是文件输入
这在Chrome,FF和Safari中效果很好但是(惊喜)不在IE中。当我尝试从我的文件输入中选择一个文件时,我得到了一个非常奇怪的响应 - 浏览器打开了一个下载对话框?!
Do you want to open or save ?apikey=key (61 bytes) from webapiserver?
我尝试在我的fileupload事件监听器中使用IE的脚本调试器和断点,它甚至从未进入内部。我在研究中看到过各种帖子和文章,表明接受类型的应用程序/ json会搞砸IE,所以我在我的代码中有一个条件来尝试处理它。
我有什么遗漏吗?
答案 0 :(得分:5)
您的问题出在服务器端。
IE有点笨蛋,他接受服务器提供的第一个内容类型,因此您始终需要牢记首先尝试使用text/plain
或text/html
回答。
答案 1 :(得分:1)
这是C#中为我设置的修复程序的实现
var result = Json(statuses, JsonRequestBehavior.AllowGet);
if (HttpContext.Request.AcceptTypes.Contains("application/json"))
{
result.ContentType = "application/json";
}
else // Hack for IE9
{
result.ContentType = "text/plain";
}
return result;
答案 2 :(得分:0)
这是因为返回的数据是application / json。您需要服务器指定内容类型text / html以防止IE将其解释为下载。