เป็นไปได้ไหมที่จะสร้างไฟล์ zip และเสนอให้ดาวน์โหลด แต่ยังไม่ได้บันทึกไฟล์ลงในฮาร์ดไดรฟ์
เป็นไปได้ไหมที่จะสร้างไฟล์ zip และเสนอให้ดาวน์โหลด แต่ยังไม่ได้บันทึกไฟล์ลงในฮาร์ดไดรฟ์
คำตอบ:
ในการเริ่มการดาวน์โหลดคุณต้องตั้งค่าContent-Disposition
ส่วนหัว:
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
หากคุณไม่ต้องการไฟล์บนดิสก์คุณจำเป็นต้องใช้ StringIO
import cStringIO as StringIO
myfile = StringIO.StringIO()
while not_finished:
# generate chunk
myfile.write(chunk)
คุณสามารถเลือกที่จะตั้งค่าContent-Length
ส่วนหัวได้เช่นกัน:
response['Content-Length'] = myfile.tell()
FileWrapper
และมันใช้งานได้
คุณจะมีความสุขมากขึ้นในการสร้างไฟล์ชั่วคราว ซึ่งจะช่วยประหยัดหน่วยความจำได้มาก เมื่อคุณมีผู้ใช้มากกว่าหนึ่งหรือสองคนพร้อมกันคุณจะพบว่าการประหยัดหน่วยความจำนั้นสำคัญมาก
อย่างไรก็ตามคุณสามารถเขียนลงในวัตถุStringIO
>>> import zipfile
>>> import StringIO
>>> buffer= StringIO.StringIO()
>>> z= zipfile.ZipFile( buffer, "w" )
>>> z.write( "idletest" )
>>> z.close()
>>> len(buffer.getvalue())
778
ออบเจ็กต์ "บัฟเฟอร์" เป็นเหมือนไฟล์ที่มีไฟล์ ZIP 778 ไบต์
ทำไมไม่สร้างไฟล์ tar แทนล่ะ? ชอบมาก:
def downloadLogs(req, dir):
response = HttpResponse(content_type='application/x-gzip')
response['Content-Disposition'] = 'attachment; filename=download.tar.gz'
tarred = tarfile.open(fileobj=response, mode='w:gz')
tarred.add(dir)
tarred.close()
return response
content_type=
แทนmimetype=
ใช่คุณสามารถใช้โมดูล zipfile , โมดูล zlibหรืออื่น ๆอัดโมดูลเพื่อสร้างไฟล์ zip ในหน่วยความจำ คุณสามารถทำให้มุมมองของคุณเขียนไฟล์ zip ไปยังHttpResponse
วัตถุที่มุมมอง Django ส่งกลับแทนที่จะส่งบริบทไปยังเทมเพลต สุดท้ายคุณจะต้องตั้งค่าชนิด mime ในรูปแบบที่เหมาะสมในการบอกเบราว์เซอร์ในการรักษาการตอบสนองเป็นไฟล์
from django.db import models
class PageHeader(models.Model):
image = models.ImageField(upload_to='uploads')
from django.http import HttpResponse
from StringIO import StringIO
from models import *
import os, mimetypes, urllib
def random_header_image(request):
header = PageHeader.objects.order_by('?')[0]
image = StringIO(file(header.image.path, "rb").read())
mimetype = mimetypes.guess_type(os.path.basename(header.image.name))[0]
return HttpResponse(image.read(), mimetype=mimetype)
มีตัวอย่างโค้ดที่http://djangosnippets.org/snippets/365/
def download_zip(request,file_name):
filePath = '<path>/'+file_name
fsock = open(file_name_with_path,"rb")
response = HttpResponse(fsock, content_type='application/zip')
response['Content-Disposition'] = 'attachment; filename=myfile.zip'
return response
คุณสามารถเปลี่ยน zip และประเภทเนื้อหาได้ตามความต้องการของคุณ
fsock = open(filePath,"rb")
เช่นเดียวกับในหน่วยความจำ tgz archive:
import tarfile
from io import BytesIO
def serve_file(request):
out = BytesIO()
tar = tarfile.open(mode = "w:gz", fileobj = out)
data = 'lala'.encode('utf-8')
file = BytesIO(data)
info = tarfile.TarInfo(name="1.txt")
info.size = len(data)
tar.addfile(tarinfo=info, fileobj=file)
tar.close()
response = HttpResponse(out.getvalue(), content_type='application/tgz')
response['Content-Disposition'] = 'attachment; filename=myfile.tgz'
return response