JQuery文件上载插件,Internet Explorer和IFrame传输

时间:2012-11-08 18:14:47

标签: jquery iframe file-upload knockout.js internet-explorer-9

我正在使用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,所以我在我的代码中有一个条件来尝试处理它。

我有什么遗漏吗?

3 个答案:

答案 0 :(得分:5)

您的问题出在服务器端。

IE有点笨蛋,他接受服务器提供的第一个内容类型,因此您始终需要牢记首先尝试使用text/plaintext/html回答。

但是提到in the FAQ from the jQuery plugin

答案 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将其解释为下载。