IE尝试在提交包含文件的jQuery多部分表单数据时下载json响应

时间:2011-11-16 11:47:13

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

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

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

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

我在Google和Google中看到了各种解决方案,基本上几乎尝试了所有描述的内容,包括通过jQuery为表单设置enctype,但它不起作用。

任何建议都会受到欢迎。

9 个答案:

答案 0 :(得分:21)

您只需将控制器中的JSON作为“text / html”返回,然后使用JQuery.parseJSON()在客户端解析它。

控制器:

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

客户方:

jsonResponse = $.parseJSON(response);

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

此解决方案一直在为我工作。

答案 1 :(得分:10)

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

我没有找到任何其他方法来阻止所述行为,然后返回明文。我尝试将JSON作为纯文本返回,然后使用$ .parseJSON进行解析,但由于某些js错误,它无法正常工作。

答案 2 :(得分:6)

只需使用'Content-Type', 'text/html'标题发送回复。

答案 3 :(得分:2)

只需设置Content-Type: text/html

即可

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

希望它有所帮助。

答案 4 :(得分:2)

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

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

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

我们并不为此感到骄傲:( IE肯定会杀死一切......

我没有尝试过zmonteca给出的建议(已经花了太多时间)但似乎值得:让我们知道你是否可以。

希望它有所帮助!

答案 5 :(得分:1)

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

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

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

data = $.parseJSON(data);

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

我提出了以下解决方法(在Zend Framework中):

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

答案 8 :(得分:-2)

从服务器端删除内容类型对我有用。