Dưới đây là một cái nhìn Django để làm điều này:
import os
import zipfile
import StringIO
from django.http import HttpResponse
def getfiles(request):
# Files (local path) to put in the .zip
# FIXME: Change this (get paths from DB etc)
filenames = ["/tmp/file1.txt", "/tmp/file2.txt"]
# Folder name in ZIP archive which contains the above files
# E.g [thearchive.zip]/somefiles/file2.txt
# FIXME: Set this to something better
zip_subdir = "somefiles"
zip_filename = "%s.zip" % zip_subdir
# Open StringIO to grab in-memory ZIP contents
s = StringIO.StringIO()
# The zip compressor
zf = zipfile.ZipFile(s, "w")
for fpath in filenames:
# Calculate path for file in zip
fdir, fname = os.path.split(fpath)
zip_path = os.path.join(zip_subdir, fname)
# Add file, at correct path
zf.write(fpath, zip_path)
# Must close zip for all contents to be written
zf.close()
# Grab ZIP file from in-memory, make response with correct MIME-type
resp = HttpResponse(s.getvalue(), mimetype = "application/x-zip-compressed")
# ..and correct content-disposition
resp['Content-Disposition'] = 'attachment; filename=%s' % zip_filename
return resp
StringIO sẽ biến mất trong Python 3.0, vì vậy bạn có thể muốn gắn mã của mình cho phù hợp. –
Nó không biến mất, chỉ cần chuyển sang mô-đun io. http://docs.python.org/3.0/library/io.html#io.StringIO –
Đúng như một suy nghĩ, vì bạn đã tạo một HttpResponse theo cách thủ công, bạn có thể không sử dụng nó làm bộ đệm không? Bằng cách đó tôi có nghĩa là vượt qua các phản ứng để 'zipfile' và để cho nó viết trực tiếp vào đó. Tôi đã làm nó với những thứ khác. Nếu bạn đang xử lý các luồng khổng lồ, nó có thể nhanh hơn và hiệu quả hơn cho bộ nhớ. – Oli