上传文件返回的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 相关文章推荐
jQuery 选择器项目实例分析及实现代码
Dec 28 Javascript
使用JS 清空File控件的路径值
Jul 08 Javascript
ztree获取当前选中节点子节点id集合的方法
Feb 12 Javascript
jQuery 回调函数(callback)的使用和基础
Feb 26 Javascript
深入理解JavaScript系列(18):面向对象编程之ECMAScript实现
Mar 05 Javascript
JavaScript使表单中的内容显示在屏幕上的方法
Jun 29 Javascript
js仿支付宝填写支付密码效果实现多方框输入密码
Mar 09 Javascript
第十章之巨幕页头缩略图与警告框组件
Apr 25 Javascript
微信小程序picker组件简单用法示例【附demo源码下载】
Dec 05 Javascript
Angular中使用MathJax遇到的一些问题
Dec 15 Javascript
基于canvas实现手写签名(vue)
May 21 Javascript
解决vue cli4升级sass-loader(v8)后报错问题
Jul 30 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
php带密码功能并下载远程文件保存本地指定目录 修改加强版
2010/05/16 PHP
PHP反转字符串函数strrev()函数的用法
2012/02/04 PHP
怎样给PHP源代码加密?PHP二进制加密与解密的解决办法
2013/04/22 PHP
php中的常用魔术方法汇总
2016/02/14 PHP
PHP创建/删除/复制文件夹、文件
2016/05/03 PHP
彻底搞懂PHP 变量结构体
2017/10/11 PHP
Node调试工具JSHint的安装及配置教程
2014/05/27 Javascript
js+jquery常用知识点汇总
2015/03/03 Javascript
javascript下使用Promise封装FileReader
2016/02/19 Javascript
js窗口震动小程序分享
2016/11/28 Javascript
Angular2 Service实现简单音乐播放器服务
2017/02/24 Javascript
Bootstrap页面标题Page Header的实现方法
2017/03/22 Javascript
ES6中字符串的使用方法扩展
2019/06/04 Javascript
JQuery实现折叠式菜单的详细代码
2020/06/03 jQuery
Python编程pygal绘图实例之XY线
2017/12/09 Python
详解Python nose单元测试框架的安装与使用
2017/12/20 Python
微信小程序跳一跳游戏 python脚本跳一跳刷高分技巧
2018/01/04 Python
使用tensorflow显示pb模型的所有网络结点方式
2020/01/23 Python
Django-rest-framework中过滤器的定制实例
2020/04/01 Python
matplotlib quiver箭图绘制案例
2020/04/17 Python
C++和python实现阿姆斯特朗数字查找实例代码
2020/12/07 Python
美国知名奢侈美容品牌零售商:Cos Bar
2017/04/21 全球购物
甜品蛋糕店创业计划书范文
2014/02/06 职场文书
工程类专业自荐信范文
2014/03/09 职场文书
《吃水不忘挖井人》教学反思
2014/04/15 职场文书
应届生求职自荐信
2014/07/04 职场文书
中学生运动会通讯稿大全
2014/09/18 职场文书
合同权益转让协议书模板
2014/11/18 职场文书
单位婚育证明范本
2014/11/21 职场文书
2014大学生学生会工作总结
2014/12/19 职场文书
2014年党小组工作总结
2014/12/20 职场文书
志愿者事迹材料
2014/12/26 职场文书
2015年班长个人工作总结
2015/04/03 职场文书
汉字听写大会观后感
2015/06/12 职场文书
2016年公共机构节能宣传周活动总结
2016/04/05 职场文书
python 命令行传参方法总结
2021/05/25 Python