Django rest framework: как отправить и скачать файл xlsx? - PullRequest
0 голосов
/ 17 февраля 2020

Я застрял на некоторое время, пытаясь отправить файл на клиентскую сторону, используя 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);

    });
}


1 Ответ

0 голосов
/ 17 февраля 2020

Вы можете сделать это легко, используя django модели полевых моделей. FileField, вы можете очень кратко и легко понять это руководство, пошаговое руководство

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

file = models.FileField (blank = False, null = False), вы можете отредактировать это как file = models.FileField (upload_to = '/ путь, по которому вы хотите загрузить файлы', blank = False, null = False)

...