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

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

摘要:


  

最近项目中出现上传文件返回的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'}


相关文章
|
5天前
|
JSON 前端开发 JavaScript
前端上传文件前校验文件数据
该文介绍了如何在Vue项目中实现批量导入Excel数据的校验。使用Element UI的`el-upload`组件上传文件,通过FileReader读取内容,结合XLSX库解析Excel为JSON。解析过程包括将二进制数据转换为workbook对象,提取worksheet并转化为JSON。之后,遍历JSON数据进行字段校验,若发现空值则记录错误。提供的Demo展示了选择Excel文件后控制台显示校验结果。技术栈包括vue 2.6.14、element ui 2.15.14和xlsx 0.17.0。建议将此类功能封装为通用组件以复用。
17 2
前端上传文件前校验文件数据
|
1月前
|
移动开发 前端开发
VForm3的文件上传后的一种文件回显方式
VForm3的文件上传后的一种文件回显方式
29 0
|
1月前
|
JSON 前端开发 JavaScript
前端上传文件前检测文件数据🔍
前端上传文件前检测文件数据🔍
77 0
|
9月前
|
JavaScript
使用 HTML input 元素上传本地文件,在服务器端打印出上传的内容
使用 HTML input 元素上传本地文件,在服务器端打印出上传的内容
85 0
|
9月前
|
API
调用图片转PDF功能时返回DocProcessError错误
调用图片转PDF功能时返回DocProcessError错误
53 3
成功解决pywintypes.com_error: (-2147352567, '发生意外。', (0, 'Kingsoft WPS', '文档保存失败。', '', 3011, -214746725
成功解决pywintypes.com_error: (-2147352567, '发生意外。', (0, 'Kingsoft WPS', '文档保存失败。', '', 3011, -214746725
成功解决pywintypes.com_error: (-2147352567, '发生意外。', (0, 'Kingsoft WPS', '文档保存失败。', '', 3011, -214746725
|
11月前
|
存储 Java
Java实现文件上传到本地(自定义保存路径)
Java实现文件上传到本地(自定义保存路径)
656 0
|
Python
Selenium:模拟用户点击(读取并执行本地文件中的URL链接)
Selenium:模拟用户点击(读取并执行本地文件中的URL链接)
337 0
如何修改Kestrel上传文件的大小
如何修改Kestrel上传文件的大小
173 0
uploadfile上传文件失败,数据接收不到问题排查步骤。
1.[font=宋体]检查域名白名单是否已经添加。[/font] 2.[font=宋体]上传[/font]URL[font=宋体]是否写对。[/font] 3.[font=宋体]服务器接收是否正确。
1070 0

热门文章

最新文章