একটি জিপ সংরক্ষণাগার তৈরি করা এবং এটি ডাউনলোড করার জন্য অফার করা কি সম্ভব, তবে এখনও হার্ড ড্রাইভে কোনও ফাইল সংরক্ষণ করা যায় না?
উত্তর:
একটি ডাউনলোড ট্রিগার করতে আপনার 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)
Ptionচ্ছিকভাবে আপনি শিরোনামও সেট করতে পারেন Content-Length:
response['Content-Length'] = myfile.tell()
FileWrapper, এবং এটি কার্যকর হয়েছে।
আপনি একটি অস্থায়ী ফাইল তৈরি করে আরও সুখী হবেন। এটি প্রচুর স্মৃতি সাশ্রয় করে। আপনার একসাথে এক বা দু'জনের বেশি ব্যবহারকারী থাকলে আপনি দেখতে পাবেন মেমরির সঞ্চয়টি খুব গুরুত্বপূর্ণ, খুব গুরুত্বপূর্ণ।
আপনি তবে স্ট্রিংআইও অবজেক্টে লিখতে পারেন ।
>>> import zipfile
>>> import StringIO
>>> buffer= StringIO.StringIO()
>>> z= zipfile.ZipFile( buffer, "w" )
>>> z.write( "idletest" )
>>> z.close()
>>> len(buffer.getvalue())
778
"বাফার" অবজেক্টটি 778 বাইট জিপ সংরক্ষণাগার সহ ফাইলের মতো।
পরিবর্তে একটি টার ফাইল তৈরি করবেন না কেন? তাই ভালো:
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=
হ্যাঁ, স্মৃতিতে একটি জিপ সংরক্ষণাগার তৈরি করতে আপনি জিপ ফাইল মডিউল , zlib মডিউল বা অন্যান্য সংক্ষেপণ মডিউল ব্যবহার করতে পারেন। আপনি নিজের দৃষ্টিভঙ্গিটি HttpResponseকোনও টেমপ্লেটে কোনও প্রসঙ্গ প্রেরণের পরিবর্তে জ্যাঞ্জো ভিউটি ফিরে আসার উদ্দেশ্যে পিন সংরক্ষণাগারটি লিখতে পারেন । শেষ অবধি, ব্রাউজারটিকে প্রতিক্রিয়াটিকে একটি ফাইল হিসাবে বিবেচনা করার জন্য আপনাকে মাইমটাইপটিকে উপযুক্ত বিন্যাসে সেট করতে হবে ।
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
আপনি আপনার প্রয়োজন অনুসারে জিপ এবং সামগ্রী প্রকার প্রতিস্থাপন করতে পারেন।
fsock = open(filePath,"rb")
মেমরি tgz সংরক্ষণাগার সহ একই:
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