我正在尝试通过jQuery.Form插件提交一个带有file
字段的表单,这里是代码:
$('form').ajaxSubmit({
url: "/path",
dataType: "json",
contentType: "multipart/form-data"
...
然后服务器返回json作为响应。在除IE之外的所有浏览器中都很好用,它试图将响应下载为文件。如果我从表单中删除文件字段,它也可以正常工作。
我在Google和Google中看到了各种解决方案,基本上几乎尝试了所有描述的内容,包括通过jQuery为表单设置enctype
,但它不起作用。
任何建议都会受到欢迎。
答案 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)
从服务器端删除内容类型对我有用。