zoukankan      html  css  js  c++  java
  • 上传文件返回数据提示下载

     摘要:

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

  • 相关阅读:
    brewhome
    WIN7下安装SQL server 2008 R2“出现性能计数器注册表配置单元一致性”失败的解决办法(新)
    话说ELK使用安装,结合.NET Core、ABP框架Nlog日志
    支付系统架构
    高可用Redis服务架构分析与搭建
    基于STS和JWT的微服务身份认证
    全面解读NoSQL数据库Redis的核心技术与应用实践
    Redis应用及安装
    微服务实践分享与探讨
    Docker的核心概念,镜像操作
  • 原文地址:https://www.cnblogs.com/xiyangbaixue/p/4136589.html
Copyright © 2011-2022 走看看