Mi chiedo se sia possibile caricare un file zip sul server web di django e inserire i file zip nel database di django senza accedere al file system attuale nel processo (ad esempio estraendo i file nel file zip in un tmp dir e quindi caricarli)File ZipExtFile in Django
Django fornisce una funzione per convertire il file python in file Django, quindi se c'è un modo per convertire ZipExtFile in file python, dovrebbe andare bene.
grazie per l'aiuto! modello
Django:
from django.db import models
class Foo:
file = models.FileField(upload_to='somewhere')
Usage:
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
uscita:
{'file': [u'This field cannot be blank.']}
[SOLUZIONE] Solution utilizzando un brutto hack:
Come rilevato correttamente dalla Don Quest, file come Clas ses come StringIO o BytesIO dovrebbero rappresentare i dati come un file virtuale. Tuttavia, il costruttore di Django File accetta solo il tipo di file incorporato e nient'altro, sebbene anche le classi simili a file avrebbero svolto il lavoro. L'hack è quello di impostare le variabili in Django :: file 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
Si prega di tenere commentare se si dispone di una soluzione migliore (tranne che per l'archiviazione personalizzato)
Don ha l'idea giusta, sebbene il file continui a colpire il file system a meno che non si utilizzi l'archiviazione di file personalizzata. –
https://docs.djangoproject.com/en/dev/howto/custom-file-storage/ – tkone
grazie per le risposte. Ma non capisco perché questo non funzionerebbe direttamente, dato che potrei facilmente memorizzare il file zip e un file nel file zip dovrebbe essere lo stesso del file zip originale. – guinny