É possível fazer um arquivo zip e disponibilizá-lo para download, mas ainda não salvar um arquivo no disco rígido?
96
Para acionar um download, você precisa definir o Content-Disposition
cabeçalho:
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
Se você não quiser o arquivo no disco, você precisa usar StringIO
import cStringIO as StringIO
myfile = StringIO.StringIO()
while not_finished:
# generate chunk
myfile.write(chunk)
Opcionalmente, você também pode definir o Content-Length
cabeçalho:
response['Content-Length'] = myfile.tell()
FileWrapper
e funcionou.Você ficará mais feliz criando um arquivo temporário. Isso economiza muita memória. Quando você tem mais de um ou dois usuários simultaneamente, descobrirá que a economia de memória é muito, muito importante.
Você pode, no entanto, gravar em um objeto StringIO .
O objeto "buffer" é semelhante a um arquivo com um arquivo ZIP de 778 bytes.
fonte
Por que não criar um arquivo tar? Igual a:
fonte
content_type=
vez demimetype=
Sim, você pode usar o módulo zipfile , módulo zlib ou outro módulos de compactação para criar um arquivo zip na memória. Você pode fazer sua visão gravar o arquivo zip no
HttpResponse
objeto que a visão Django retorna ao invés de enviar um contexto para um modelo. Por último, você precisará definir o tipo MIME para o formato apropriado para informar ao navegador para tratar a resposta como um arquivo .fonte
models.py
views.py
fonte
Há um exemplo de código em http://djangosnippets.org/snippets/365/
fonte
Você pode substituir o zip e o tipo de conteúdo de acordo com sua necessidade.
fonte
fsock = open(filePath,"rb")
Mesmo com o arquivo tgz na memória:
fonte