Sparta Coding Club/Today I Learned [TIL]

[TIL] #DAY - 057 - ImageField 저장 시 이름 변경(python, Django)

양한마리 2022. 11. 24. 04:40
728x90



ImageField를 사용하면서 이미지를 저장을 파일명을 변경해서 저장

추가 사항으로 임의에 파일명으로 바꾸는 방법으로 진행한다.

 




[문제 요약]

1. 파일명이 한글일 경우 읽지 못하는 상황
2. mac os 에서는 읽을 수 있지만 window 환경에서는 읽지 못하는 파일명

[풀이 요약]

1. uuid 를 사용하여 임의에 파일명 생성
2. 파일명을 변환해주는  함수(instance, filename) 생성
3. ImageField 필드의 upload_to 파라미터에 2번에서 만들어준 함수 설정

[코드]

1. models.py

import os
from uuid import uuid4


def rename_imagefile_to_uuid(instance, filename): 	# instance : Feed 모델에서 __str__로 반환해주는 값 현재는 title로 지정
    												# filename : 원본 파일명
    upload_to = f'original_feed_images/' 			# 파일 저장 위치 설정
    ext = filename.split('.')[-1]        			# 원본 파일명 text.jpg->[text, jpg]로 나누어주고 -1 번째 값만 ext에 담아주기
    uuid = uuid4().hex                   			# 50da5daca34d4802a771047ee463c234 이런 형식에 임의에 이름 생성
    filename = '{}.{}'.format(uuid, ext) 			# '{uuid}.{ext}' -> 50da5daca34d4802a771047ee463c234.jpg
										 			# format(uuid, ext) -> uuid = 파일명, ext = 파일 형식
    return os.path.join(upload_to, filename)		# DB에 저장할 값을 리턴
    
    
class Feed(models.Model): # 피드
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=30)
    content = models.TextField(max_length=255)
    original_image = models.ImageField(blank=True, upload_to=rename_imagefile_to_uuid, null=True) # upload_to 파라미터에 위에서 만들어준 함수 지정
    transfer_image = models.ImageField(blank=True, upload_to="transfer_feed_images/", null=True)  # 기존 ImageField
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
	
    def __str__(self):
        return str(self.title)

 

728x90
반응형