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

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

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

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

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

任何build议将非常受欢迎。

你可以直接从控制器返回JSON作为“text / html”,然后使用JQuery.parseJSON()在客户端parsing它。

控制器:

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

客户端:

 jsonResponse = $.parseJSON(response); if(jsonResponse.prop1==5) { ... } 

这个解决scheme一直在为我工作。

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

我没有find任何其他方式来阻止其他行为,然后返回明文。 我试图返回JSON作为明文,然后parsing它与$ .parseJSON,但它没有工作,由于一些JS错误。

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

只需设置Content-Type: text/html

发生这种情况是因为IE8不能识别application/... MIMEtypes。 这对我有用。

希望能帮助到你。

与你们相同的情况:只有在使用$(form).ajaxSubmit(...)函数的enctype="multipart/form-data"forms时才会出现问题。

我的团队和我不得不用dataType: 'text'replace(在这个函数中) dataType: 'json'选项并添加responseText = $.parseJSON(responseText); 强制服务器响应parsing。

当然,我们还必须在服务器端使用"text/plain"头来返回响应,而不是"application/json"

我们并不感到自豪:( IE绝对是杀死所有的东西…

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

希望能帮助到你!

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

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

在你的控制器行动。 在客户端,在jQuery的情况下,你可以做

 data = $.parseJSON(data); 

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

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

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

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

从服务器中删除ContentType适用于我。