django 파일 다운로드

3324 단어
django에서 파일을 다운로드할 때, 만약 파일이 비교적 작다면, 해결 방법은 먼저 전송할 내용을 모두 메모리에 생성한 다음에 Response 대상에 한꺼번에 전송하는 것이다.
def simple_file_download(request):
    # do something...
    content = open("simplefile", "rb").read()
    return HttpResponse(content)

만약 파일이 매우 크면 가장 간단한 방법은 정적 파일 서버, 예를 들어 Apache나 Nginx 서버를 사용하여 다운로드를 처리하는 것이다.그러나 때때로 우리는 사용자의 권한에 대한 제한을 해야 하거나, 사용자에게 파일의 실제 주소를 폭로하고 싶지 않거나, 이 큰 내용이 임시로 생성된 (예를 들어 임시로 여러 파일을 합쳐서 만든 것) 이기 때문에 정적 파일 서버를 사용할 수 없다.
templates/index.html

, , , , , “ ” 。 , 。

11.png

, view , view , 。

11.png


, , 。


views.py
def download_file(request):  
    # do something  
  
    the_file_name='xxx.png'             #                        
    filename='media/uploads/xxx.png'    #          
    response=StreamingHttpResponse(readFile(filename))  
    response['Content-Type']='application/octet-stream'  
    response['Content-Disposition']='attachment;filename="{0}"'.format(the_file_name)  
    return response  
  
def readFile(filename,chunk_size=512):  
    with open(filename,'rb') as f:  
        while True:  
            c=f.read(chunk_size)  
            if c:  
                yield c  
            else:  
                break  

python도 클래스 파일의 대상을 교체기로 포장하는 파일 패키지를 제공합니다: (검증되지 않았습니다)
class FileWrapper:
    """Wrapper to convert file-like objects to iterables"""
    def __init__(self, filelike, blksize=8192):
        self.filelike = filelike
        self.blksize = blksize
        if hasattr(filelike,'close'):
            self.close = filelike.close
    def __getitem__(self,key):
        data = self.filelike.read(self.blksize)
        if data:
            return data
        raise IndexError
    def __iter__(self):
        return self
    def next(self):
        data = self.filelike.read(self.blksize)
        if data:
            return data
        raise StopIteration

사용 시views.py의 쓰기
from django.core.servers.basehttp import FileWrapper
from django.http import HttpResponse
import os
def file_download(request,filename):
    wrapper = FileWrapper(file('filepath'))
    response = HttpResponse(wrapper, content_type='application/octet-stream')
    response['Content-Length'] = os.path.getsize(path) ??????
    response['Content-Disposition'] = 'attachment; filename=%s' % filename
    return response

좋은 웹페이지 즐겨찾기