上传文件返回数据提示下载

 摘要:

   最近项目中出现上传文件返回的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,如果项目中遇到同样问题,改成对应语言。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。