사용자 정의django 파일 저장 시스템 업로드 파일 크기 제한

10310 단어 django
1. settings 파일 설정
MEDIA_URL="/media/"  #      url   
MEDIA_ROOT=os.path.join(BASE_DIR, "media")  #        ,           
MAX_FILE_SIZE = 104857600  #       100MB

2. django의 응용 프로그램 디렉터리(또는 다른 위치)에서 새 파일storage.py을 만듭니다. 코드는 다음과 같습니다.
class FileTooLarge(Exception):
    """
              ,     exception.py      
    """

class LiterDocStorage(FileSystemStorage):
	# location base_url     ,   settings        ,        
    def __init__(self, location=settings.MEDIA_ROOT, base_url=settings.MEDIA_URL):
        #    ,location
        super(LiterDocStorage, self).__init__(location, base_url)

    def _save(self, name, content):
        """         100MB"""
        if content.size > settings.MAX_FILE_SIZE:
            raise FileTooLarge('     %sMB' % int((settings.MAX_FILE_SIZE / (1024 * 1024))))
        return super(LiterDocStorage, self)._save(name, content)

파일 크기는self를 통과할 수 없습니다.size (name)에서 가져왔습니다. (이 방법은 보기 함수에서 파일 대상을 얻은 후 호출되며 file.size 속성에서 호출된 방법입니다.)
출력 콘텐츠의 유형을 통해 이 콘텐츠는 InMemoryUploadedFiledjango.core.files.uploaderdfile인 것을 알 수 있습니다. 소스 코드는 다음과 같습니다.
class InMemoryUploadedFile(UploadedFile):
    """
    A file uploaded into memory (i.e. stream-to-memory).
    """
    def __init__(self, file, field_name, name, content_type, size, charset, content_type_extra=None):
        super().__init__(file, name, content_type, size, charset, content_type_extra)
        self.field_name = field_name

    def open(self, mode=None):
        self.file.seek(0)
        return self

    def chunks(self, chunk_size=None):
        self.file.seek(0)
        yield self.read()

    def multiple_chunks(self, chunk_size=None):
        # Since it's in memory, we'll never have multiple chunks.
        return False

속성 크기가 보이기 때문에 콘텐츠를 통해.크기 파일 크기, 단위byte
3. 모델의 설정
class MyModel(models.Model):
    upload = models.FileField(upload_to='uploads/', storage=LiterDocStorage())

4. 보기 함수에서 사용
file = request.FILES.get('file')  #        
try:
	MyModel.objects.create(upload=file)
except FileTooLarge as e:  #          100MB
    code = 1
    msg = '      ,%s' % str(e)	

참조: FileField
Managing files
FileSystemStorage
사용자 지정 스토리지 시스템 작성

좋은 웹페이지 즐겨찾기