ImageField가있는 모델이 있습니다. 이미 upload_to 을 설정하고 그러나 ... 고유 한 이름으로 파일을 저장 처리하는 내 자신의 FileSystemStorage 클래스 ...django ImageField - 이름을 사용자 정의하고 이전 파일을 제거하는 방법
이 설정은 내가 업로드하고있는 파일을 저장할 수 있습니다를 만들었습니다 각 파일의 고유 한 이름 (괜찮 았음). 그러나 나는 또한 이 필요합니다. 예전 파일 인을 제거하십시오.
나는 file1.png을 업로드하고이를 file1_xkdeujg.png로 저장의 I 다음 (그래서 모델을 통해 할 필요가 장고 관리 인터페이스를 사용하여) 장고 관리자로 이동
(그건 그냥 임의의 문자열이다) 및 변경 필요로하는 것은
지금 일이 fileNEW.png하는 해당 필드의 이미지입니다 : 그것은 fileNEW_fjewiejk.png 새로운 파일 (고유 한 임의의 문자열 저장할 때마다 이미지) 저장
1) - 가
을 수행을2)는 데이터베이스에 새 파일 저장 - 가
3을 수행)가 이전 파일을 제거 - file1_xkdeuig.png - 파일 시스템에서 -하지 을
Q : 그 누구도 날 도와 드릴까요 포인트 3?
일부 코드 :
class Page(models.Model):
image = models.ImageField(upload_to='pages/', storage=MyFileSystemStorage())
그리고 (다른 곳에서이 코드를 빌려 대부분 ...) : 파일의 이름을 변경하는 경우
class MyFileSystemStorage(FileSystemStorage):
def get_valid_name(self, name):
file_root, file_ext = os.path.splitext(name)
return "%s_%s%s" % (file_root, rand_key(8), file_ext)
def get_available_name(self, name):
dir_name, file_name = os.path.split(name)
file_root, file_ext = os.path.splitext(file_name)
count = itertools.count(1)
while self.exists(name):
name = os.path.join(dir_name, "%s_%s%s" % (rand_key(32), count.next(), file_ext))
return name
예 - 의미가 있습니다. 내가 사용한 답변에 대한 링크는 내 대답을 참조하십시오. –
os.system ("rm"+ path) 대신 os.remove (path)를 사용하여 직접 파일을 제거해야합니다.입력 내용의 유효성을 검사하지 않으면 사람들이 서버에서 임의의 코드를 임의로 실행하게 할 수 있습니다. 예 : path_to_file이 "image.png; rm -rf /"로 설정된 경우 어떻게됩니까? 그런 다음 서버가이를 실행합니다. – Rory
플러스 포크 대신에 표준 라이브러리 호출을 사용하고 명령을 실행하므로 훨씬 더 편리합니다. – sleblanc