¿Es posible crear un archivo zip y ofrecerlo para descargar, pero aún no guardar un archivo en el disco duro?
96
Para activar una descarga, debe configurar el Content-Disposition
encabezado:
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 no desea el archivo en el disco, debe usar StringIO
import cStringIO as StringIO
myfile = StringIO.StringIO()
while not_finished:
# generate chunk
myfile.write(chunk)
Opcionalmente, también puede configurar el Content-Length
encabezado:
response['Content-Length'] = myfile.tell()
FileWrapper
y funcionó.Estarás más feliz creando un archivo temporal. Esto ahorra mucha memoria. Cuando tiene más de uno o dos usuarios al mismo tiempo, encontrará que el ahorro de memoria es muy, muy importante.
Sin embargo, puede escribir en un objeto StringIO .
El objeto "búfer" es similar a un archivo con un archivo ZIP de 778 bytes.
fuente
¿Por qué no crear un archivo tar en su lugar? Al igual que:
fuente
content_type=
lugar demimetype=
Sí, puede utilizar el módulo zipfile , el módulo zlib u otros módulos de compresión para crear un archivo zip en la memoria. Puede hacer que su vista escriba el archivo zip en el
HttpResponse
objeto que devuelve la vista de Django en lugar de enviar un contexto a una plantilla. Por último, deberá configurar el tipo MIME en el formato adecuado para indicarle al navegador que trate la respuesta como un archivo .fuente
modelos.py
views.py
fuente
Hay un ejemplo de código en http://djangosnippets.org/snippets/365/
fuente
Puede reemplazar el código postal y el tipo de contenido según sus requisitos.
fuente
fsock = open(filePath,"rb")
Lo mismo con el archivo tgz en memoria:
fuente