জ্যাঙ্গো দিয়ে ডাউনলোড করার জন্য ফাইল তৈরি করা হচ্ছে


96

একটি জিপ সংরক্ষণাগার তৈরি করা এবং এটি ডাউনলোড করার জন্য অফার করা কি সম্ভব, তবে এখনও হার্ড ড্রাইভে কোনও ফাইল সংরক্ষণ করা যায় না?

উত্তর:


112

একটি ডাউনলোড ট্রিগার করতে আপনার 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()

4
আমি মনে করি বিষয়বস্তু-দৈর্ঘ্য
জাঙ্গো

4
এই উদাহরণটি ব্যবহার করে এমন ফাইল ডাউনলোড করা যায় যা সর্বদা খালি থাকে, কোনও ধারণা?
উটকেস

4
@ এলিজাজ ২৮ যেমন বলেছেন, এটি আমার ক্ষেত্রেও ফাঁকা ফাইল তৈরি করছে। আমি সবে সরিয়েছি FileWrapper, এবং এটি কার্যকর হয়েছে।
সাবস্টিয়ান দেপ্রেজ

এই উত্তরটি জ্যাঙ্গো ১.৯-এর সাথে কাজ করে না: এটি দেখুন: stackoverflow.com/a/35485073/375966
আফশিন মেহরাবানি

4
আমি আমার ফাইলটি রিড মোডে খুললাম তারপরে file.getvalue () অ্যাট্রিবিউট ত্রুটি দিচ্ছে: টেক্সটআইআওআরএপারের কোনও গুনভ্যালু নেই।
শুভম শ্রীবাস্তব

25

আপনি একটি অস্থায়ী ফাইল তৈরি করে আরও সুখী হবেন। এটি প্রচুর স্মৃতি সাশ্রয় করে। আপনার একসাথে এক বা দু'জনের বেশি ব্যবহারকারী থাকলে আপনি দেখতে পাবেন মেমরির সঞ্চয়টি খুব গুরুত্বপূর্ণ, খুব গুরুত্বপূর্ণ।

আপনি তবে স্ট্রিংআইও অবজেক্টে লিখতে পারেন ।

>>> import zipfile
>>> import StringIO
>>> buffer= StringIO.StringIO()
>>> z= zipfile.ZipFile( buffer, "w" )
>>> z.write( "idletest" )
>>> z.close()
>>> len(buffer.getvalue())
778

"বাফার" অবজেক্টটি 778 বাইট জিপ সংরক্ষণাগার সহ ফাইলের মতো।


4
মেমরি সংরক্ষণ সম্পর্কে ভাল পয়েন্ট। কিন্তু যদি একটি অস্থায়ী ফাইল ব্যবহার করে থাকেন তবে আপনি এটি মুছতে কোডটি কোথায় রাখবেন?
অ্যান্ড্রুর্ক

@ সুপারজয় 30: পর্যায়ক্রমিক ক্লিনআপ জবস। জাজানো ইতিমধ্যে একটি অ্যাডমিন কমান্ড রয়েছে যা পুরানো সেশনগুলি সরিয়ে রাখতে পর্যায়ক্রমে চালানো উচিত।
এসলট

@ সুপারজয় 3030 এটাই /
টিএমপি হ'ল

@ এসলট কি মোড এক্স-সেন্ডফাইল ব্যবহার করে তৈরি করা ফাইল (আপনার উদাহরণে জেড) পরিবেশন করা সম্ভব?
আমির আফিয়ানান

10

পরিবর্তে একটি টার ফাইল তৈরি করবেন না কেন? তাই ভালো:

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

4
জ্যাঙ্গোর নতুন সংস্করণের জন্য, আপনার content_type=পরিবর্তে থাকা উচিতmimetype=
গিলিয়াম লেব্রেটন ২ '

9

হ্যাঁ, স্মৃতিতে একটি জিপ সংরক্ষণাগার তৈরি করতে আপনি জিপ ফাইল মডিউল , zlib মডিউল বা অন্যান্য সংক্ষেপণ মডিউল ব্যবহার করতে পারেন। আপনি নিজের দৃষ্টিভঙ্গিটি HttpResponseকোনও টেমপ্লেটে কোনও প্রসঙ্গ প্রেরণের পরিবর্তে জ্যাঞ্জো ভিউটি ফিরে আসার উদ্দেশ্যে পিন সংরক্ষণাগারটি লিখতে পারেন । শেষ অবধি, ব্রাউজারটিকে প্রতিক্রিয়াটিকে একটি ফাইল হিসাবে বিবেচনা করার জন্য আপনাকে মাইমটাইপটিকে উপযুক্ত বিন্যাসে সেট করতে হবে


6

মডেল.পি

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)

চিত্রের আকারের ইন-মেমরি স্ট্রিং তৈরি করতে অনিরাপদ দেখাচ্ছে।
dিল


5
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

আপনি আপনার প্রয়োজন অনুসারে জিপ এবং সামগ্রী প্রকার প্রতিস্থাপন করতে পারেন।


4
আপনি বোঝাতে চেয়েছিলেনfsock = open(filePath,"rb")
স্টিলিওস

4

মেমরি 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.