zl程序教程

您现在的位置是:首页 >  其他

当前栏目

上传文件返回的json数据会被提示下载问题解决方案

2023-06-13 09:15:31 时间

最近项目中出现上传文件返回的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格式的”