Apakah mungkin membuat arsip zip dan menawarkannya untuk diunduh, tetapi tetap tidak menyimpan file ke hard drive?
96
Untuk memicu unduhan, Anda perlu menyetel Content-Disposition
header:
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
Jika Anda tidak ingin file pada disk Anda perlu menggunakan StringIO
import cStringIO as StringIO
myfile = StringIO.StringIO()
while not_finished:
# generate chunk
myfile.write(chunk)
Secara opsional, Anda juga dapat mengatur Content-Length
tajuk:
response['Content-Length'] = myfile.tell()
FileWrapper
, dan berhasil.Anda akan lebih senang membuat file sementara. Ini menghemat banyak memori. Bila Anda memiliki lebih dari satu atau dua pengguna secara bersamaan, Anda akan menemukan bahwa penyimpanan memori sangat, sangat penting.
Namun, Anda dapat menulis ke objek StringIO .
Objek "buffer" adalah seperti file dengan arsip ZIP 778 byte.
sumber
Mengapa tidak membuat file tar saja? Seperti:
sumber
content_type=
bukannyamimetype=
Ya, Anda dapat menggunakan modul zipfile , modul zlib atau modul kompresi lainnya untuk membuat arsip zip di memori. Anda bisa membuat tampilan Anda menulis arsip zip ke
HttpResponse
objek yang dikembalikan tampilan Django alih-alih mengirim konteks ke templat. Terakhir, Anda perlu menyetel mimetype ke format yang sesuai untuk memberi tahu browser agar memperlakukan respons sebagai file .sumber
models.py
views.py
sumber
Ada contoh kode di http://djangosnippets.org/snippets/365/
sumber
Anda dapat mengganti zip dan tipe konten sesuai kebutuhan Anda.
sumber
fsock = open(filePath,"rb")
Sama dengan di arsip tgz memori:
sumber