Мне интересно, есть ли способ загрузить zip-файл на веб-сервер django и поместить файлы zip в базу данных django БЕЗ доступа к реальной файловой системе в процессе (например, извлечение файлов из zip-файла в каталог tmp изатем загрузите их)
Django предоставляет функцию для преобразования файла Python в файл Django, поэтому, если есть способ конвертировать ZipExtFile в файл Python, все будет хорошо.
спасибо за помощь!
Модель Django:
from django.db import models
class Foo:
file = models.FileField(upload_to='somewhere')
Использование:
from zipfile import ZipFile
from django.core.exceptions import ValidationError
from django.core.files import File
from io import BytesIO
z = ZipFile('zipFile')
istream = z.open('subfile')
ostream = BytesIO(istream.read())
tmp = Foo(file=File(ostream))
try:
tmp.full_clean()
except Validation, e:
print e
Вывод:
{'file': [u'This field cannot be blank.']}
[РЕШЕНИЕ] Решение с использованием уродливого хака:
Как правильно указал Дон Квест, файловые классы, такие как StringIO или BytesIO, должны представлять данные в виде виртуального файла.Тем не менее, конструктор Django File принимает только встроенный тип файла и ничего более, хотя файловые классы также сделали бы эту работу.Хак - установить переменные в Django :: File вручную:
buf = bytesarray(OPENED_ZIP_OBJECT.read(FILE_NAME))
tmp_file = BytesIO(buf)
dummy_file = File(tmp_file) # this line actually fails
dummy_file.name = SOME_RANDOM_NAME
dummy_file.size = len(buf)
dummy_file.file = tmp_file
# dummy file is now valid
Пожалуйста, продолжайте комментировать, если у вас есть лучшее решение (за исключением пользовательского хранилища)