Ошибка: Требуется байтоподобный объект, а не 'list'
Я разрабатываю небольшой проект, целью которого является предоставление пользователю возможности отправить zip-файл. Система должна прочитать файл, извлечь его и сохранить его содержимое в базе данных.
У меня такая ошибка: требуется байтоподобный объект, а не 'list', потому что я пытался использовать BytesIo. без него ошибка говорит:" fpin.seek(0, 2) AttributeError: у объекта 'list' нет атрибута 'seek'"
Мой код выглядит следующим образом
files = request.FILES.getlist('document[]')
with zipfile.ZipFile(io.BytesIO(files), "r")as archive:
for zippedFileName in archive.namelist():
with archive.open(zippedFileName) as myfile:
with io.BytesIO() as buf:
buf.write(myfile.read())
buf.seek(0)
file = File(buf, zippedFileName).decode('utf-8')
rbe = UploadedFile.objects.create(document=file)
rbe.user= request.user
rbe.save()
return render(request, 'uploader/index.html', {'files': files})
В Django, request.FILES.getlist
возвращает список UploadedFile
объектов, каждый из которых имеет file
атрибут, файлоподобный объект, который вы можете передать непосредственно в ZipFile
конструктор.
Поскольку ваш код, очевидно, предполагает, что в списке, возвращаемом UploadedFile
, есть только один объект request.FILES.getlist
, вы можете распаковать его следующим образом:
uploaded_file, = request.FILES.getlist('document[]')
with zipfile.ZipFile(uploaded_file.file, "r") as archive:
...