微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

[JS][兼容IE]通过ajax从后台获取数据并直接由JS下载

难点:

  • 后端:要用什么样的形式将准备好的data 传递给前端。
  • 前端:如何触发浏览器直接下载,尤其是还要兼容IE

后端用的django:

# 前略
import json
chart_data_dict = chart_data_prepare(df)
response = HttpResponse(json.dumps({'status': 0,  # 一个用来标志后台是否有error的状态位,跟download 功能没有关系
                                    'download_data': df.to_csv(encoding='utf_8_sig'),  # !!这里是重点
                                    'download_filename': 'XXX' + datetime.datetime.Now().strftime('%m%d%H%M%s') + '.csv'
                                    }), content_type="application/json")

return response

前端:

$.ajax({
    type: 'get',
    url: url,
    Traditional:true,
    dataType:'json',
    async:false,
    success:function(result){


        // download raw data to user.
        if (window.navigator.msSaveBlob) {
            // IE - IE 不支持download 属性,所以比较麻烦。
            var download_data = result['download_data'];
                 var blobData = '\uFEFF'  // BOM head, make excel kNow it is csv.
                 blobData += download_data;
                 var blobObj = new Blob([blobData], {type: "application/octet-stream"});  // 创建blob对象的时候错了好几次,最后发现要再外面套个[]_(:з)∠)_
                window.navigator.msSaveBlob(blobObj, result['download_filename'])
            }
            else{
                 //chrome or other - 页面会直接开始下载
                 var download_data = result['download_data'];
                 var blobData = '\uFEFF'  // BOM head, make excel kNow it is csv.
                 blobData += download_data;
                 var export_uri = 'data:text/csv;charset=utf-8,'+encodeURIComponent(blobData);
                 var a_obj = document.createElement('a');
                 a_obj.setAttribute("href", export_uri);
                 a_obj.setAttribute("download", result['download_filename']);
                 a_obj.click();

                // document.getElementById('download_link').href = export_uri;  // 如果页面上有a标签,这样做就可以,然后让用户手动点击再下载
            }
        
    }
 });

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐