2011-03-18 4 views
1

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 

답변

1

...

기본적으로, 당신은 초기화 방법에 원본 이미지를 저장 한 다음이 저장하기 전에 변경되었는지 확인합니다.

저장 후 원본 이미지 경로에 저장된 이미지를 삭제하십시오.

이 답변도 참조하십시오. (Josh의 답변은 내가 데이터베이스에 부딪치지 않았으므로 사용하고 선호하는 대답입니다).

Django: When saving, how can you check if a field has changed?

0

내가보다, 제대로 이해하고 파일이 이동하는 대신 복제됩니다. Page 클래스의 save 메소드를 재정의하면 old 및 dew 인스턴스에 액세스 할 수 있습니다. http://docs.djangoproject.com/en/dev/topics/db/models/#overriding-model-methods

당신이 다음 super.save을 호출 한 후, 변수에 기존 파일 이름을 저장하기 만하면()는 파일이 경우 os.system("rm "+path_to_file) 변경할 수 있습니다 때. 도움이 되나요?

대답에 유래에 비슷한 질문에서 온
+0

예 - 의미가 있습니다. 내가 사용한 답변에 대한 링크는 내 대답을 참조하십시오. –

+0

os.system ("rm"+ path) 대신 os.remove (path)를 사용하여 직접 파일을 제거해야합니다.입력 내용의 유효성을 검사하지 않으면 사람들이 서버에서 임의의 코드를 임의로 실행하게 할 수 있습니다. 예 : path_to_file이 "image.png; rm -rf /"로 설정된 경우 어떻게됩니까? 그런 다음 서버가이를 실행합니다. – Rory

+0

플러스 포크 대신에 표준 라이브러리 호출을 사용하고 명령을 실행하므로 훨씬 더 편리합니다. – sleblanc