首页 > 解决方案 > 无法使用 XMLHttpRequest 和 Xhtml2pdf 下载多个文件

问题描述

您好我正在尝试使用 XXLHttpRequest 生成和下载多个文件,但它从未响应 javascript 的请求。

这是我的javascript代码:

{%block javascript%}
<script type="text/javascript">

function exportPDFForAll(employees) {
var employeesList = [
{% for emp in employees %}
    {% if not forloop.first %},{% endif %}
    {
        name: "{{ emp.name }}"

    }
{% endfor %}
]


alert(employeesList)

for (var i = 0; i < employeesList.length; i++){
    var params = 'selectedName='+employeesList[i].name+'&selectedDate='+$('#date').val()+'&csrfmiddlewaretoken='+$('input[name=csrfmiddlewaretoken]').val();
    var req = new XMLHttpRequest();
    req.open("POST", "/exportallsheets/", true);
    req.responseType = "blob";
    //Send the proper header information along with the request
    req.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
    req.onload = function (event) {
        var blob = req.response;
        console.log(blob.size);
        var link=document.createElement('a');
        link.href=window.URL.createObjectURL(blob);
        link.download=employeesList[i].name+"_" + new Date() + ".pdf";
        link.click();
    };

    req.send(params);
  }
}
</script>
{%endblock%}

这是我在 Django 中的渲染类:

from io import BytesIO, StringIO
from django.http import HttpResponse
from django.template.loader import get_template
import xhtml2pdf.pisa as pisa


class Render:

@staticmethod
def render(path: str, params: dict):
    template = get_template(path)
    html = template.render(params)
    result = BytesIO()
    pdf = pisa.pisaDocument(BytesIO(html.encode("UTF-8")), result)
    if not pdf.err:
        # return HttpResponse(result.getvalue(), content_type='application/pdf')
        response = HttpResponse(result.getvalue(), content_type='application/pdf')
        filename = "Invoice_%s.pdf" %(params['name'])
        content = "inline; filename=%s" %(filename)

        content = "attachment; filename=%s" %(filename)
        response['Content-Disposition'] = content
        print(response)
        return response
    else:
        return HttpResponse("Error Rendering PDF", status=400)

该代码从 javascript 到 Django 运行良好,它也在内存中创建 pdf,但它永远不会返回到 req.onload 回调。但是,如果我尝试单个文件并且不使用 javascript/ajax 等,那么它可以正常工作并直接下载文件。我很困惑,任何帮助将不胜感激。我在截止日期前运行:(

标签: javascriptpythondjango

解决方案


推荐阅读