39

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

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

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

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

任何建议都将受到欢迎。

4

9 回答 9

21

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

控制器:

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

客户端:

jsonResponse = $.parseJSON(response);

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

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

于 2012-09-29T07:32:29.797 回答
10

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

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

于 2011-11-19T03:33:35.057 回答
6

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

于 2012-12-17T11:15:51.190 回答
2

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

我和我的团队不得不替换(在此功能中)dataType: 'json'选项dataType: 'text'并添加responseText = $.parseJSON(responseText);以强制服务器响应解析。

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

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

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

希望能帮助到你!

于 2014-04-16T19:51:24.593 回答
2

刚设置Content-Type: text/html

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

希望能帮助到你。

于 2014-03-11T12:43:21.250 回答
1

如果你和 Zend 一起工作,你可以做到

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

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

data = $.parseJSON(data);
于 2012-05-09T12:20:09.800 回答
0

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

if (!$this->_request->isXmlHttpRequest()) {
    die('<textarea>'.Zend_Json::encode($data).'</textarea>');
}
$this->view->assign($data);
于 2012-06-25T12:13:24.510 回答
0

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

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

于 2012-05-02T01:35:43.263 回答
-2

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

于 2014-10-17T07:33:43.573 回答