【问题标题】:IE tries to download json response while submitting jQuery multipart form data containing fileIE 在提交包含文件的 jQuery 多部分表单数据时尝试下载 json 响应
【发布时间】:2011-11-16 11:47:12
【问题描述】:

我正在尝试通过 jQuery.Form 插件提交带有 file 字段的表单,代码如下:

$('form').ajaxSubmit({
  url: "/path",
  dataType: "json",
  contentType: "multipart/form-data"
...

然后服务器返回 json 作为响应。在除 IE 之外的所有浏览器中都能正常工作,它会尝试将响应下载为文件。如果我从表单中删除文件字段,它也可以正常工作。

我在这里和 Google 中看到了各种解决方案,基本上尝试了所描述的几乎所有方法,包括通过 jQuery 为表单设置 enctype,但没有成功。

非常欢迎任何建议。

【问题讨论】:

  • 您的页面似乎正在重定向。请您发布更多您的解决方案吗?
  • 它没有重定向。我的 Rails 控制器呈现 json(当我将该文件保存在 IE 中时 - 我确切地看到返回的 json 中应该包含什么)。
  • 遇到了完全相同的问题,返回“text/plain”内容类型似乎可行。 $.parseJSON 在 Chrome 中也能正常工作,但在 IE 中添加了
     标签。替换 
     标签后一切正常。

标签: json ajax internet-explorer multipartform-data jqueryform


【解决方案1】:

您可以简单地从控制器返回 JSON 作为“text/html”,然后在客户端使用 JQuery.parseJSON() 对其进行解析。

控制器:

    return this.Json(
            new
                {
                    prop1 = 5,
                    prop2 = 10
                }, 
            "text/html");

客户端:

jsonResponse = $.parseJSON(response);

if(jsonResponse.prop1==5) {
     ...
}

这个解决方案一直对我有用。

【讨论】:

  • 这对我也有用,但我必须在服务端为 IE 更改这个调用似乎很荒谬。
  • 实际上,只有 IE 10 之前的 IE 版本会受此影响。如果您想让这个变通方法有条件(它可能会影响性能),您可以检查“接受”请求标头。如果“Accept”标头不包含“application/json”,您只需使用此解决方法。我使用 DRYness 的响应过滤器解决了这个问题。
  • +1 我正在尝试使用 Asp.Net MVC 返回一个带有 json 值的 ContentResult 类型,除了 IE8 之外一切正常。现在,使用 ContentType 等于 'text/html' 的 JsonResult,它适用于所有浏览器。
【解决方案2】:

我还没有找到直接的解决方案,但我最终实现了以下解决方法:我在我的 ajax 设置中使用了dataType: "text",然后从控制器返回纯文本,用; 分隔值并解析它们客户端。这样 IE 和 Forefox 就会停止尝试下载响应。

除了返回纯文本之外,我没有找到任何其他方法来防止上述行为。我尝试将 JSON 作为纯文本返回,然后用 $.parseJSON 解析它,但由于一些 js 错误,它没有工作。

【讨论】:

  • 我的解决方法有点不同。我还必须将响应中的标题设置为文本/html。因为用dataType: 'text'ie8/ie9也想下载文件。
  • 对于 IE 8/9 将您的标题设置为 text/plain 并保留您的 dataType:'json'。 IE 8/9 不会崩溃,jquery 会在这些情况下正确解析您的数据。
【解决方案3】:

只需发送带有'Content-Type', 'text/html' 标头的响应。

【讨论】:

    【解决方案4】:

    只需设置Content-Type: text/html

    这是因为 IE8 无法识别 application/... mimetype。 这对我有用。

    希望对你有帮助。

    【讨论】:

      【解决方案5】:

      与你们的情况相同:问题仅出现在与$(form).ajaxSubmit(...) 函数一起使用的enctype="multipart/form-data" 表单中。

      我和我的团队必须将(在此函数中)dataType: 'json' 选项替换为 dataType: 'text' 并添加 responseText = $.parseJSON(responseText); 以强制服务器响应解析。

      当然,我们还必须进入服务器端以返回带有"text/plain" 标头而不是"application/json" 的响应

      我们并不为此感到自豪 :( IE 肯定会扼杀一切......

      我没有尝试 zmonteca 提供的建议(已经花费了太多时间),但它似乎值得:让我们知道它是否适合您。

      希望对你有帮助!

      【讨论】:

        【解决方案6】:

        如果你使用 Zend,你可以做到

        $this->getResponse()->setHeader('Content-Type', 'text/html');
        

        在您的控制器操作中。在客户端,如果是 jQuery,你可以做

        data = $.parseJSON(data);
        

        【讨论】:

          【解决方案7】:

          这个网站有一些关于将响应包装在 http://forum.jquery.com/topic/jquery-form-malsup-ie7-file-download-security-warning-on-ajax-file-upload

          我似乎能够通过让我的服务器将 JSON 作为字符串返回来解决我的问题。 然后我在完整事件中使用了 JSON.parse()。

          【讨论】:

            【解决方案8】:

            我想出了以下解决方法(在 Zend 框架中):

            if (!$this->_request->isXmlHttpRequest()) {
                die('<textarea>'.Zend_Json::encode($data).'</textarea>');
            }
            $this->view->assign($data);
            

            【讨论】:

              【解决方案9】:

              从服务器端删除 ContentType 对我有用。

              【讨论】:

              • 请详细说明你的答案。
              猜你喜欢
              • 2015-03-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-12-12
              • 2013-03-06
              • 2013-10-10
              • 1970-01-01
              相关资源
              最近更新 更多