上传文件返回的json数据会被提示下载问题解决方案


Posted in Javascript onDecember 03, 2014

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

总结,其实解决这个问题,简单的说就一句话“将后端返回的数据格式改成text/html格式的”

Javascript 相关文章推荐
JavaScript入门教程(7) History历史对象
Jan 31 Javascript
javascript 自定义事件初探
Aug 21 Javascript
javascript prototype原型操作笔记
Dec 07 Javascript
jQuery 方法大全方便学习参考
Feb 25 Javascript
根据对象的某一属性进行排序的js代码(如:name,age)
Aug 10 Javascript
Jquery 自定义事件实现发布/订阅的简单实例
Jun 12 Javascript
JavaScript实现256色转灰度图
Feb 22 Javascript
Vue按需加载的具体实现
Dec 02 Javascript
Angular实现的日程表功能【可添加及隐藏显示内容】
Dec 27 Javascript
JavaScript同源策略和跨域访问实例详解
Apr 03 Javascript
Node.js 多进程处理CPU密集任务的实现
May 26 Javascript
使用apifm-wxapi快速开发小程序过程详解
Aug 05 Javascript
使用jQuery实现验证上传图片的格式与大小
Dec 03 #Javascript
使用正则表达式的格式化与高亮显示json字符串
Dec 03 #Javascript
jquery中获取元素里某一特定子元素的代码
Dec 02 #Javascript
JS逆序遍历实现代码
Dec 02 #Javascript
javascript框架设计读书笔记之数组的扩展与修复
Dec 02 #Javascript
javascript框架设计读书笔记之字符串的扩展和修复
Dec 02 #Javascript
javascript框架设计读书笔记之模块加载系统
Dec 02 #Javascript
You might like
PHP5.2中date()函数显示时间与北京时间相差8小时的解决办法
2009/05/28 PHP
解析如何通过PHP函数获取当前运行的环境 来进行判断执行逻辑(小技巧)
2013/06/25 PHP
PHP 安全检测代码片段(分享)
2013/07/05 PHP
Javascript与PHP验证用户输入URL地址是否正确
2014/10/09 PHP
PHP文件缓存类示例分享
2015/01/30 PHP
jquery命令汇总,方便使用jquery的朋友
2012/06/26 Javascript
JavaScript中的Primitive对象封装介绍
2014/12/31 Javascript
js实现网页右上角滑出会自动消失大幅广告的方法
2015/02/27 Javascript
javascript实现页面刷新时自动清空表单并选中的方法
2015/07/18 Javascript
快速掌握Node.js中setTimeout和setInterval的使用方法
2016/03/21 Javascript
js Date()日期函数浏览器兼容问题解决方法
2017/09/12 Javascript
使用vue-router beforEach实现判断用户登录跳转路由筛选功能
2018/06/25 Javascript
对angular 监控数据模型变化的事件方法$watch详解
2018/10/09 Javascript
elementUI Tree 树形控件的官方使用文档
2019/04/25 Javascript
微信小程序进入广告实现代码实例
2019/09/19 Javascript
Python绘制正余弦函数图像的方法
2018/08/28 Python
Python当中的array数组对象实例详解
2019/06/12 Python
Python实现图片批量加入水印代码实例
2019/11/30 Python
pytorch中的卷积和池化计算方式详解
2020/01/03 Python
Python进程间通信multiprocess代码实例
2020/03/18 Python
送给他或她的礼物:FUN.com
2018/08/17 全球购物
什么是SQL Server的确定性函数和不确定性函数
2016/08/04 面试题
心得体会范文
2014/01/04 职场文书
招聘与培训专员岗位职责
2014/01/30 职场文书
师范教师专业大学生职业生涯规划范文
2014/03/02 职场文书
产品生产计划书
2014/05/07 职场文书
我的中国梦口号
2014/06/16 职场文书
班级课外活动总结
2014/07/09 职场文书
开学第一周总结
2015/07/16 职场文书
消防演习感想
2015/08/10 职场文书
我爱我班主题班会
2015/08/13 职场文书
Nginx快速入门教程
2021/03/31 Servers
go语言中GOPATH GOROOT的作用和设置方式
2021/05/05 Golang
Vue+Element UI实现概要小弹窗的全过程
2021/05/30 Vue.js
一文弄懂MySQL中redo log与binlog的区别
2022/02/15 MySQL
MongoDB数据库之添删改查
2022/04/26 MongoDB