JavaScript ajax下载文件

 

JavaScript Ajax http get 方法,利用a标签下载文件流。

文件流:django返回文件流 示例

复制代码
from django.http import StreamingHttpResponse


class DownloadExportExcel(View):
    def get(self, request, *args, **kwargs):
        file_name = request.GET.get("filename")
        # print("DownloadExportExcel file_name: ", file_name)
        def file_iterator(file_name, chunk_size=512):
            with open(file_name, 'rb') as f:
                while True:
                    c = f.read(chunk_size)
                    if c:
                        yield c
                    else:
                        break

        tmp_file_path = getattr(settings, "SEARCH_ID_POUR_OUT_TMP_PATH", "/tmp")
        file_path = tmp_file_path + file_name
        # file_path = file_name
        response = StreamingHttpResponse(file_iterator(file_path))
        response['Content-Type'] = 'application/octet-stream'
        response['Content-Disposition'] = 'attachment;filename*=UTF-8\"{0}\"'.format(file_name)
        return response
复制代码

ajax 前端请求示例

 

复制代码
        function exportSearchResult(filter_company_name, thisElement) {
                let search_type_val = $('#select').val();
                let search_ids_val = trimNValue($('#ids').val());
                let filter_strs_val = trimValue($('#filter_textarea').val());
                let notice_val = trimValue($('#notice_textarea').val());
                let search_ak_start_time = trimValue($('#search_ak_start_time').val());
                let search_ak_end_time = trimValue($('#search_ak_end_time').val());
                let search_ak_size = trimValue($('#search_ak_size').val());
                let export_company_name = filter_company_name
                {# jquery获取调用本函数的元素 #}
                console.log(thisElement);
                if (filter_company_name != ""){
                    filter_strs_val = trimValue(filter_company_name)
                }

                let datas = {
                        'search_type': search_type_val,
                        'search_ids': search_ids_val,
                        'filter_strs': filter_strs_val,
                        'notice': notice_val,
                        'export_company_name': export_company_name,
                        csrfmiddlewaretoken: $('input[name=csrfmiddlewaretoken]').val()
                    }
                if (search_type_val == "AK_LOG") {
                    datas["search_ak_start_time"] = search_ak_start_time
                    datas["search_ak_end_time"] = search_ak_end_time
                    datas["search_ak_size"] = search_ak_size
                }
                // 倒出提示
                let queryTime = "倒出Excel....  "
                $("#ordinary_message span").html(queryTime);
                $("#ordinary_message").removeClass("hide");
                flushQuerySecond = true;
                interval = setInterval(printSeconds, 1000, "导出中");
                {# 发起查询中禁用按钮,避免没查完又重复发起 #}
                thisElement.setAttribute("disabled", "disabled");
                thisElement.textContent = "导出中..." ;
                $.ajax({
                    type: 'POST',
                    url: '/export_excel',
                    data: datas,
                    success: function (text) {
                        // 这里是请求成功后的回调函数
                        // 您可以在这里处理文件下载的操作
                        var link = document.createElement('a');
                        link.style.display = 'none';
                        link.href = '/download_searchresult/?filename=' + encodeURIComponent(text);
                        link.setAttribute('download', text);
                        document.body.appendChild(link);
                        link.click();
                        document.body.removeChild(link);
                        console.log("下载完毕~")
                        flushQuerySecond = false;
                        let notice_text = $("#ordinary_message span").text().replaceAll("中.... 已", "") + " 倒出成功~,请看默认下载路径";
                        notice_text = notice_text.replaceAll("导出中", "")
                        notice_text = notice_text.replaceAll(".", "")
                        displayOrdinaryNewMessage(notice_text, 60000);
                        thisElement.removeAttribute("disabled");
                        thisElement.textContent = "导出Excel" ;
                    },
                    error: function (response) {
                        let err_message = JSON.stringify(response);
                        $('#result').html('<p>出错:' + err_message + '</p>');
                        flushQuerySecond = false;
                        let notice_text = $("#ordinary_message span").text().replaceAll("中.... 已", "") + " 倒出excel失败!!!";
                        displayOrdinaryNewMessage(notice_text, 60000);
                        thisElement.removeAttribute("disabled");
                        thisElement.textContent = "导出Excel" ;
                    }
                });
                {#let queryTime = "查询中....  "#}
                {#$("#ordinary_message span").html(queryTime);#}
                {#$("#ordinary_message").removeClass("hide");#}
                {#flushQuerySecond = true;#}
                {#interval = setInterval(printSeconds, 1000);#}
                {#displayOrdinaryNewMessage("查询中......", 120000)#}
            }
复制代码

 

posted on   zhangmingda  阅读(481)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2020-11-25 金山云 KS3 Python SDK 多线程并发上传文件;下载断点续传 参考脚本
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示