上传文件返回的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格式的”