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