上传文件返回的json数据会被提示下载问题解决方案
最近项目中出现上传文件返回的json数据会被提示下载,只有在ie10+中才会出现这个问题。前端使用jQuery的插件ajaxForm提交表单,后台返回的数据格式为json。代码如下:
后端Python:
defjsonp(func):
"""WrapsJSONifiedoutputforJSONPrequests."""
@wraps(func)
defdecorated_function(*args,**kwargs):
callback=request.args.get('callback',False)
temp_content= func(*args,**kwargs)
ifisinstance(temp_content,dict):
temp_content.setdefault('success',True)
temp_content.setdefault('code',200)
try:
temp_content=json.dumps(temp_content,indent=4)
exceptUnicodeDecodeError:
try:
temp_content=ujson.dumps(temp_content)
exceptStandardErrorase:
logger.exception(e)
temp_content=json.dumps({'success':False,'code':500,'info':'INVALID_CONTENT'})
temp_content=cgi.escape(temp_content)
ifcallback:
#依据http://evilcos.me/?p=425,jsonp添加/**/头部会安全一些
content='/**/'+str(callback)+'('+temp_content+')'
mimetype='application/javascript'
headers={'charset':'utf-8'}
returncurrent_app.response_class(content,mimetype=mimetype,headers=headers)
else:
mimetype='application/json'
headers={'charset':'utf-8'}
content=temp_content
returncurrent_app.response_class(content,mimetype=mimetype,headers=headers)
elifisinstance(temp_content,basestring):
temp_content=cgi.escape(temp_content)
returntemp_content
else:
returntemp_content
returndecorated_function
@mod.route('/patch/install.json',methods=['POST'])
@jsonp
defpatch_install():
return{'data':'data'}
前端js代码:
$('#form').ajaxSubmit({
url :'/patch/install.json',
type :'post',
dataType:'json',
iframe :true,
success:function(res){
//code
}
});
解决办法:
需要将后端返回的数据格式改成text/html格式的,如下:
defplain(func):
"""wraptext/htmlreponse"""
@wraps(func)
def_inner(*args,**kwargs):
resp=func(*args,**kwargs)
ifisinstance(resp,dict):
resp.setdefault('success',True)
resp.setdefault('code',200)
resp=json.dumps(resp)
resp=cgi.escape(resp)
returncurrent_app.response_class(resp,mimetype='text/html',headers={'charset':'utf-8'})
elifisinstance(resp,basestring):
resp=cgi.escape(resp)
returncurrent_app.response_class(resp,mimetype='text/html',headers={'charset':'utf-8'})
else:
returnresp
return_inner
@mod.route('/patch/install.json',methods=['POST'])
@plain
defpatch_install():
return{'data':'data'}
注意:此例后端是用Python,如果项目中遇到同样问题,改成对应语言
总结,其实解决这个问题,简单的说就一句话“将后端返回的数据格式改成text/html格式的”
热门推荐
10 对患者生日祝福语简短
11 结婚祝福语简短装备
12 周岁祝福语学生文案简短
13 订婚领证祝福语简短精辟
14 导师获奖祝福语大全简短
15 新婚购房祝福语简短精辟
16 牛年祝福语简短的爱人
17 送芒果的祝福语简短
18 送给学长毕业祝福语简短