Me pregunto si hay una manera de cargar un archivo zip al servidor web django y poner los archivos zip en la base de datos django SIN acceder al sistema de archivos real en el proceso (por ejemplo, extraer los archivos en el zip un directorio tmp y luego cárguelos)ZipExtFile to Django File
Django proporciona una función para convertir archivos Python a archivos Django, por lo que si hay una forma de convertir ZipExtFile a archivos Python, debería estar bien.
gracias por ayuda! modelo
Django:
from django.db import models
class Foo:
file = models.FileField(upload_to='somewhere')
Uso:
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
Salida:
{'file': [u'This field cannot be blank.']}
[Solución] Solución utilizando un feo corte:
Como se ha señalado correctamente Don Quest, clasificado como archivo ses como StringIO o BytesIO deben representar los datos como un archivo virtual. Sin embargo, el constructor de Django File solo acepta el tipo de archivo incorporado y nada más, aunque las clases similares a archivos también habrían hecho el trabajo. El truco es establecer las variables en Django :: Archivo manualmente:
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
Se le recuerda al comentar si tiene una mejor solución (excepto para el almacenamiento personalizado)
Don tiene la idea correcta, aunque el archivo aún llegará al sistema de archivos a menos que use almacenamiento de archivos personalizado. –
https://docs.djangoproject.com/en/dev/howto/custom-file-storage/ – tkone
gracias por las respuestas. Pero no entiendo por qué esto no funcionaría directamente, ya que podría almacenar fácilmente el archivo zip y un archivo en el archivo zip debería ser el mismo que el archivo zip original. – guinny