2

我正在使用这个插件(只是基本版本),并且正在利用所有简洁的功能进行进度更新,以使用我自己的 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,所以我的代码中有一个条件来尝试处理它。

有什么我想念的吗?

4

3 回答 3

5

您的问题出在服务器端。

IE 有点笨,他接受服务器提供的第一个内容类型,所以你总是需要记住首先尝试用text/plainor回答text/html

然而,jQuery 插件的常见问题解答中提到了这一点。

于 2013-09-13T09:40:24.083 回答
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;
于 2014-07-24T14:08:27.493 回答
0

这是因为返回的数据是application/json。您需要服务器指定内容类型 text/html 以防止 IE 将其解释为下载。

于 2013-01-27T22:11:42.187 回答