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适用于我。