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,如果项目中遇到同样问题,改成对应语言。

  • 相关阅读:
    Perl 基础笔记: 使用 cpanm 安装 Perl 模块
    修改CPAN安装源
    JQUERY实现点击INPUT使光标移动到最后或指定位置
    新手入门Underscore.js 中文(template)
    深入浅出C/C++中的正则表达式库
    [libxml2]_[XML处理]_[使用libxml2的xpath特性修改xml文件内容]
    Mysql事务的隔离级别
    HBase基础知识摘要
    java如何实现一个Future
    遇到过的问题整理-大量页面监控问题
  • 原文地址:https://www.cnblogs.com/xiyangbaixue/p/4136589.html
Copyright © 2011-2022 走看看