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

简介: 摘要:    最近项目中出现上传文件返回的json数据会被提示下载,只有在ie10+中才会出现这个问题。前端使用jQuery的插件ajaxForm提交表单,后台返回的数据格式为json。代码如下:    后端Python: def jsonp(func): """Wraps JSONified output for JSONP requests.

 摘要:

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

相关文章
|
开发者
如何画业务架构图
如何快速上手画业务架构图
11270 2
|
人工智能 JSON 自然语言处理
ChatGPT:如何写好 Prompt ?
现在已经产生了一种新职业:Prompt Engineer(提示指令工程师),可见 Prompt 是多么重要,且编写不易。
1573 1
|
Java mybatis 数据库连接
Java 函数优雅之道
导读 随着软件项目代码的日积月累,系统维护成本变得越来越高,是所有软件团队面临的共同问题。持续地优化代码,提高代码的质量,是提升系统生命力的有效手段之一。软件系统思维有句话“Less coding, more thinking(少编码、多思考)”,也有这么一句俚语“Think more, code less(思考越多,编码越少)”。
4123 67
|
Java Spring
SpringBoot 简介
SpringBoot 简介
251 0
|
数据采集 缓存 监控
IoT日志利器:嵌入式日志客户端(C Producer)发布
2017年12月19日至20日,2017云栖大会·北京峰会在国家会议中心召开,飞天智能是贯穿云栖大会不变的主题,云计算、大数据、人工智能、物联网等热门话题备受各方关注。其中阿里云日志服务发布的嵌入式日志采集客户端(C Producer Library) 就是其中解决物联网日志采集、分析难的利器。
7804 0
IoT日志利器:嵌入式日志客户端(C Producer)发布
|
存储 缓存 API
什么是云储存网关
什么是云储存网关
645 0
|
Java
不学无数——初识反射
反射:运行时的类信息 运行时类型信息使得你可以在程序运行时发现和使用类型信息 1. Class对象 通过Class对象可以在运行时发现一个对象完整的类继承结构 类是程序的一部分,每一个类都会有一个Class对象。
1122 0
|
Android开发
【Android】仿淘宝商品详情页面的下拉渐变
最近需要做一个和最新版淘宝相似的商品详情页。先看原版: 淘宝的版本 我实现的效果: 我的版本 因为单纯实现渐变功能,所以背景只用了一张尺寸较大的imageview。
2761 0
|
网络协议 应用服务中间件 Linux
下一篇
oss云网关配置