Est-il possible de créer une archive zip et de la proposer au téléchargement, mais toujours pas d'enregistrer un fichier sur le disque dur?
96
Pour déclencher un téléchargement, vous devez définir l'en- Content-Disposition
tête:
from django.http import HttpResponse
from wsgiref.util import FileWrapper
# generate the file
response = HttpResponse(FileWrapper(myfile.getvalue()), content_type='application/zip')
response['Content-Disposition'] = 'attachment; filename=myfile.zip'
return response
Si vous ne voulez pas le fichier sur le disque, vous devez utiliser StringIO
import cStringIO as StringIO
myfile = StringIO.StringIO()
while not_finished:
# generate chunk
myfile.write(chunk)
En option, vous pouvez également définir l'en- Content-Length
tête:
response['Content-Length'] = myfile.tell()
FileWrapper
, et cela a fonctionné.Vous serez plus heureux de créer un fichier temporaire. Cela économise beaucoup de mémoire. Lorsque vous avez plus d'un ou deux utilisateurs simultanément, vous constaterez que l'économie de mémoire est très, très importante.
Vous pouvez cependant écrire dans un objet StringIO .
L'objet "buffer" est semblable à un fichier avec une archive ZIP de 778 octets.
la source
Pourquoi ne pas créer un fichier tar à la place? Ainsi:
la source
content_type=
place demimetype=
Oui, vous pouvez utiliser le module zipfile , module zlib ou d' autres modules de compression pour créer une archive zip en mémoire. Vous pouvez faire en sorte que votre vue écrive l'archive zip sur l'
HttpResponse
objet que la vue Django renvoie au lieu d'envoyer un contexte à un modèle. Enfin, vous devrez définir le type MIME au format approprié pour indiquer au navigateur de traiter la réponse comme un fichier .la source
models.py
views.py
la source
Il y a un exemple de code à http://djangosnippets.org/snippets/365/
la source
Vous pouvez remplacer le zip et le type de contenu selon vos besoins.
la source
fsock = open(filePath,"rb")
Idem avec l'archive tgz en mémoire:
la source