【问题标题】:Django rest framework: How do I send and download xlsx file?Django rest 框架:如何发送和下载 xlsx 文件?
【发布时间】:2020-06-01 10:56:02
【问题描述】:

我一直在尝试使用 django-rest-framework 向客户端发送文件。我可以将其作为字节发送,但我不知道如何在客户端管理它以将其下载为 xlsx 文件。我尝试的一切都以损坏的文件结束。

这是我目前所拥有的:

# views.py
from django.http import HttpResponse
from openpyxl import load_workbook
from openpyxl.writer.excel import save_virtual_workbook

class DownloadApiView(APIView):
    authentication_classes = [BasicAuthentication, SessionAuthentication]
    permission_classes = (IsAuthenticated,)

    def post(self, request):
        try:
            file_path = './temp.xlsx'
            pk = request.data['xml_id']
            report = Report.objects.get(pk=pk)
            wbrd = load_workbook(filename=file_path)
            bytes = save_virtual_workbook(wb)

            response = HttpResponse(bytes, content_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
            response['Content-Disposition'] = "attachment; filename=temp.xlsx"
            return response
        except Exception as error_msg:
            logger.error(error_msg)
            return Response({'error': 'Failed to retrieve file.'}, status=HTTP_400_BAD_REQUEST)

# client js called onclick()
function downloadFile(xmlID, type) {
    let url = '/api/download_report/';
    let $submit = $.ajax({
        type: 'POST',
        url: url,
        data: JSON.stringify(inputData),
        contentType: 'application/json',
        headers: {"X-CSRFToken": getCookie("csrftoken")},
    });
    $submit.done(function (data) {
        console.log(data);

        let a = window.document.createElement('a');
        a.href = window.URL.createObjectURL(new Blob(data, {type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'}));
        a.download = 'temp.xlsx';

        document.body.appendChild(a);
        a.click();
        document.body.removeChild(a);

    });
}


【问题讨论】:

    标签: javascript python django django-rest-framework xlsx


    【解决方案1】:

    您可以使用 django 模型字段 models.FileField 轻松完成此操作,您可以按照本教程进行非常简短且易于理解的分步指南

    https://blog.vivekshukla.xyz/uploading-file-using-api-django-rest-framework/

    file = models.FileField(blank=False, null=False)
    #you can edit this to 
    file = models.FileField(upload_to='/the path where you want to download files',blank=False, null=False)
    

    【讨论】:

    • 这很有帮助,但不适用于我正在尝试做的事情。客户端坚持将数据以字节的形式保存在数据库中,然后通过api调用发送给客户端。我已经明确表达了我对这些方法的担忧,但这是他们的产品,无论出于何种原因,他们都坚持这种做事方式。即使你是正确的做事方式,我也会保持这个开放的替代答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 2015-01-26
    • 2016-02-16
    • 1970-01-01
    相关资源
    最近更新 更多