上传文件返回的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图像处理—亮度对比度应用案例
Jan 03 Javascript
jquery iframe操作详细解析
Nov 20 Javascript
js读写cookie实现一个底部广告浮层效果的两种方法
Dec 29 Javascript
JS实现局部选择打印和局部不选择打印
Apr 03 Javascript
angularjs实现多张图片上传并预览功能
Feb 24 Javascript
ES6使用let命令更简单的实现块级作用域实例分析
Mar 31 Javascript
Angular2数据绑定详解
Apr 18 Javascript
Javascript中JSON数据分组优化实践及JS操作JSON总结
Dec 22 Javascript
详解如何在微信小程序开发中正确的使用vant ui组件
Sep 13 Javascript
深入理解react-router 路由的实现原理
Sep 26 Javascript
微信小程序获取用户绑定手机号方法示例
Jul 21 Javascript
layui 表格操作列按钮动态显示的实现方法
Sep 06 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
第七节 类的静态成员 [7]
2006/10/09 PHP
PHP产生随机字符串函数
2006/12/06 PHP
《PHP编程最快明白》第二讲 数字、浮点、布尔型、字符串和数组
2010/11/01 PHP
一个简单且很好用的php分页类
2013/10/26 PHP
ThinkPHP3.1数据CURD操作快速入门
2014/06/19 PHP
PHP实现一维数组转二维数组的方法
2015/02/25 PHP
浅析PHP中Session可能会引起并发问题
2015/07/23 PHP
IE6中使用position导致页面变形的解决方案(js代码)
2011/01/09 Javascript
获取select元素被选中的文本内容的js代码
2014/01/29 Javascript
利用js读取动态网站从服务器端返回的数据
2014/02/10 Javascript
javascript写的异步加载js文件函数(支持数组传参)
2014/06/07 Javascript
详解js中构造流程图的核心技术JsPlumb
2015/12/08 Javascript
jQuery unbind()方法实例详解
2016/01/19 Javascript
jQuery设置单选按钮radio选中/不可用的实例代码
2016/06/24 Javascript
基于JS如何实现给字符加千分符(65,541,694,158)
2016/08/03 Javascript
几句话带你理解JS中的this、闭包、原型链
2016/09/26 Javascript
使用BootStrap和Metroui设计的metro风格微网站或手机app界面
2016/10/21 Javascript
JS实现旋转木马式图片轮播效果
2017/01/18 Javascript
Async Validator 异步验证使用说明
2017/07/03 Javascript
JS轮播图实现简单代码
2021/02/19 Javascript
jQuery 选择方法及$(this)用法实例分析
2020/05/19 jQuery
简单了解three.js 着色器材质
2020/08/03 Javascript
浅谈vue-props的default写不写有什么区别
2020/08/09 Javascript
[01:14]辉夜杯战队访谈宣传片—NEWBEE.Y
2015/12/26 DOTA
[01:35]2018完美盛典章节片——共竞
2018/12/17 DOTA
Java及python正则表达式详解
2017/12/27 Python
使用python对文件中的单词进行提取的方法示例
2018/12/21 Python
selenium+python自动化测试之多窗口切换
2019/01/23 Python
对python中的float除法和整除法的实例详解
2019/07/20 Python
python利用tkinter实现屏保
2019/07/30 Python
pd.DataFrame统计各列数值多少的实例
2019/12/05 Python
Java Spring项目国际化(i18n)详细方法与实例
2020/03/20 Python
夏尔巴人登珠峰品牌:Sherpa Adventure Gear
2018/02/08 全球购物
2015中秋节晚会开场白
2015/07/30 职场文书
2016同学毕业寄语大全
2015/12/04 职场文书
Mysql基础知识点汇总
2021/05/26 MySQL