Как заархивировать несколько загруженных файлов в Django перед сохранением в базу данных? - PullRequest
0 голосов
/ 25 февраля 2020

Я пытаюсь сжать папку перед сохранением в базу данных / систему хранения файлов, используя Django. Для этой задачи я использую библиотеку ZipFile. Вот код view.py:

class BasicUploadView(View):
    def get(self, request):
        file_list = file_information.objects.all()
        return render(self.request, 'fileupload_app/basic_upload/index.html',{'files':file_list})

    def post(self, request):
        zipfile = ZipFile('test.zip','w')
        if request.method == "POST":
            for upload_file in request.FILES.getlist('file'): ## index.html name
                zipfile.write(io.BytesIO(upload_file))
                fs = FileSystemStorage()
                content = fs.save(upload_file.name,upload_file)
                data = {'name':fs.get_available_name(content), 'url':fs.url(content)}
            zipfile.close()
        return JsonResponse(data)

Но я получаю следующую ошибку:

TypeError: a bytes-like object is required, not 'InMemoryUploadedFile'

Есть ли решение этой проблемы? Поскольку мне, возможно, придется загружать папку с большими файлами, нужно ли для этой цели написать собственный TemporaryFileUploadHandler? Я недавно начал работать с Django, и это довольно ново для меня. Пожалуйста, помогите мне советом.

1 Ответ

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

InMemoryUploadedFile - это объект, который содержит больше, чем просто файл, который вы должны открыть, файл и прочитать его содержимое (InMemoryUploadedFile.file - это файл)

InMemoryUploadedFile.open() 

Вы должен открыть файл с помощью open () и затем прочитать () его содержимое, также вы должны проверить, правильно ли вы загрузили файлы, также вы можете использовать с синтаксисом как для zip, так и для файла https://www.pythonforbeginners.com/files/with-statement-in-python

...