上传文件返回的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之更有效率的字符串替换
Aug 02 Javascript
firebug的一个有趣现象介绍
Nov 30 Javascript
jQuery设置div一直在页面顶部显示的方法
Oct 24 Javascript
JavaScript字符串对象split方法入门实例(用于把字符串分割成数组)
Oct 16 Javascript
JavaScript中的fontsize()方法使用详解
Jun 08 Javascript
基于js实现的限制文本框只可以输入数字
Dec 05 Javascript
微信小程序 开发之快递查询功能的实现
Jan 09 Javascript
为Jquery EasyUI 组件加上清除功能的方法(详解)
Apr 13 jQuery
mpvue 单文件页面配置详解
Dec 02 Javascript
详解Vue+Element的动态表单,动态表格(后端发送配置,前端动态生成)
Apr 20 Javascript
详解vue-cli中使用rem,vue自适应
May 06 Javascript
vue实现顶部菜单栏
Nov 08 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
SONY ICF-SW7600的电路分析
2021/03/02 无线电
Thinkphp框架开发移动端接口(1)
2016/08/18 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
2018/02/06 PHP
PHP getID3类的使用方法学习笔记【附getID3源码下载】
2019/10/18 PHP
javascript 浏览器判断 绑定事件 arguments 转换数组 数组遍历
2009/07/06 Javascript
11个用于提高排版水平的基于jquery的文字效果插件
2012/09/14 Javascript
jQuery JSON实现无刷新三级联动实例探讨
2013/05/28 Javascript
JavaScript实现大数的运算
2014/11/24 Javascript
QQ登录背景闪动效果附效果演示源码下载
2015/09/22 Javascript
jQuery语法小结(超实用)
2015/12/31 Javascript
基于jquery实现轮播特效
2016/04/22 Javascript
微信小程序 时间格式化(util.formatTime(new Date))详解
2016/11/16 Javascript
微信小程序 基础知识css样式media标签
2017/02/15 Javascript
原生js仿浏览器滚动条效果
2017/03/02 Javascript
Angularjs2不同组件间的通信实例代码
2017/05/06 Javascript
浅谈针对Vue相同路由不同参数的刷新问题
2018/09/29 Javascript
Javascript 关于基本类型和引用类型的个人理解
2019/11/01 Javascript
Vue.js 实现地址管理页面思路详解(地址添加、编辑、删除和设置默认地址)
2019/12/11 Javascript
JS 事件机制完整示例分析
2020/01/15 Javascript
Python入门篇之字典
2014/10/17 Python
Python字典操作简明总结
2015/04/13 Python
python自动发邮件库yagmail的示例代码
2018/02/23 Python
python爬虫面试宝典(常见问题)
2018/03/02 Python
解决Python中定时任务线程无法自动退出的问题
2019/02/18 Python
python 负数取模运算实例
2020/06/03 Python
matplotlib设置颜色、标记、线条,让你的图像更加丰富(推荐)
2020/09/25 Python
python基于pexpect库自动获取日志信息
2021/02/01 Python
英国一家集合了众多有才华设计师品牌的奢侈店:Wolf & Badger
2018/04/18 全球购物
Skip Hop官网:好莱坞宝宝挚爱品牌
2018/06/17 全球购物
SQL里面如何插入自动增长序列号字段
2012/03/29 面试题
销售人员自我评价怎么写
2013/09/19 职场文书
单位绩效考核方案
2014/05/11 职场文书
环保小标语
2014/06/13 职场文书
争做文明公民倡议书
2014/08/29 职场文书
美国旅游签证工作证明
2014/10/14 职场文书
酒店厨房管理制度
2015/08/06 职场文书