如何通过 ajax post 请求下载作为 django 响应的 zip 文件?

How to download zip file coming as django response through ajax post request?

所以,在我 ajax post 请求我的 Django 查看 return 一个 zip 文件作为响应之后。我想在收到回复后立即下载该 zip 文件。但我不知道该怎么办。我经历了很多答案,但对我没有用。现在正在下载 zip 文件,但是当我打开它时它已损坏。我的 Django 响应 zip 文件类型是 .

Ajax Post 请求代码

function upload(url) {
    let pdf_file = $('#file_input').get(0).files[0];
    let form_data = new FormData();
    form_data.append("file", pdf_file);
    jQuery.ajax({
        url: url,
        type: "POST",
        data: form_data,
        enctype: 'multipart/form-data',
        contentType: false,
        processData: false,
        success: function (response) {
            var binaryData = [];
            binaryData.push(response);
            var link = document.createElement('a');
            link.href = window.URL.createObjectURL(new Blob(binaryData, {type: "application/zip"}))
            link.download = 'sample.zip';
            document.body.appendChild(link);
            link.click();
            
        },
        error: function (response) {
            loading_btn.classList.add("d-none");
            upload_btn.classList.remove("d-none");
        }
    });
}

ajax响应

Django 视图

@csrf_exempt
def upload_file(request):
    if request.is_ajax() and request.method == 'POST':
        zip_file = open('/home/deftbox/PycharmProjects/pdf_data_Extractor/test.zip', 'rb')
        return FileResponse(zip_file)

压缩下载后,当我打开 zip 文件时出现错误 **加载存档时出错。 *

打开 zip 文件时出错

如果您想使用 jQuery.ajax 下载(二进制)文件,您必须使用 xhrFields 设置二进制 responseType

function upload(url) {
    let pdf_file = $('#file_input').get(0).files[0];
    let form_data = new FormData();
    form_data.append("file", pdf_file);
    jQuery.ajax({
        url: url,
        type: "POST",
        data: form_data,
        contentType: false,
        processData: false,
        xhrFields:{
            responseType: 'blob'
        },
        success: function (response) {
            var link = document.createElement('a');
            link.href = window.URL.createObjectURL(response)
            link.download = 'sample.zip';
            document.body.appendChild(link);
            link.click();
            
        },
        error: function (response) {
            loading_btn.classList.add("d-none");
            upload_btn.classList.remove("d-none");
        }
    });
}