首页 > 网站 > WEB开发 > 正文

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

2024-04-27 14:15:58
字体:
来源:转载
供稿:网友

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

摘要:

  最近项目中出现上传文件返回的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'])@jsonpdef 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'])@plaindef patch_install():    return {'data': 'data'}

注意:此例后端是用Python,如果项目中遇到同样问题,改成对应语言。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表