首页 / 脚本样式 / JavaScript / 上传文件返回的json数据会被提示下载问题解决方案
最近项目中出现上传文件返回的json数据会被提示下载,只有在ie10+中才会出现这个问题。前端使用jQuery的插件ajaxForm提交表单,后台返回的数据格式为json。代码如下:
后端Python:
复制代码 代码如下:
def jsonp(func):
"""Wraps JSONified output for JSONP requests."""
@wraps(func)
def decorated_function(*args, **kwargs):
callback = request.args.get("callback", False)
temp_content = func(*args, **kwargs)
if isinstance(temp_content, dict):
temp_content.setdefault("success", True)
temp_content.setdefault("code", 200)
try:
temp_content = json.dumps(temp_content, indent=4)
except UnicodeDecodeError:
try:
temp_content = ujson.dumps(temp_content)
except StandardError as e:
logger.exception(e)
temp_content = json.dumps({"success": False, "code": 500, "info": "INVALID_CONTENT"})
temp_content = cgi.escape(temp_content)
if callback:
# 依据 http://evilcos.me/?p=425,jsonp添加/**/头部会安全一些
content = "/**/" + str(callback) + "(" + temp_content + ")"
mimetype = "application/javascript"
headers = {"charset":"utf-8"}
return current_app.response_class(content, mimetype=mimetype,headers=headers)
else:
mimetype = "application/json"
headers = {"charset":"utf-8"}
content = temp_content
return current_app.response_class(content, mimetype=mimetype,headers=headers)
elif isinstance(temp_content, basestring):
temp_content = cgi.escape(temp_content)
return temp_content
else:
return temp_content
return decorated_function
@mod.route("/patch/install.json", methods=["POST"])
@jsonp
def patch_install():
return {"data": "data"}
前端js代码:
复制代码 代码如下:
$("#form").ajaxSubmit({
url : "/patch/install.json",
type : "post",
dataType : "json",
iframe : true,
success: function(res) {
// code
}
});
解决办法:
需要将后端返回的数据格式改成text/html格式的,如下:
复制代码 代码如下:
def plain(func):
"""wrap text/html reponse"""
@wraps(func)
def _inner(*args, **kwargs):
resp = func(*args, **kwargs)
if isinstance(resp, dict):
resp.setdefault("success", True)
resp.setdefault("code", 200)
resp = json.dumps(resp)
resp = cgi.escape(resp)
return current_app.response_class(resp, mimetype="text/html", headers={"charset": "utf-8"})
elif isinstance(resp, basestring):
resp = cgi.escape(resp)
return current_app.response_class(resp, mimetype="text/html", headers={"charset": "utf-8"})
else:
return resp
return _inner
@mod.route("/patch/install.json", methods=["POST"])
@plain
def patch_install():
return {"data": "data"}
注意:此例后端是用Python,如果项目中遇到同样问题,改成对应语言
总结,其实解决这个问题,简单的说就一句话“将后端返回的数据格式改成text/html格式的”