2012-06-20 125 views
2

在我的項目中,我有一個使用Imagekit處理圖像的模型。當我保存圖像我有以下要求:Imagekit - 刪除原始文件後未刪除的圖像

  • 重命名圖像和縮略圖爲唯一的名稱
  • 當一個新的圖像加載時,老人們應該被移除(並且在緩存縮略圖應該刷新新圖像)。

爲了實現這一點,我使用以下代碼:

模型:

def generate_cache_filename(instance, path, specname, extension): 
    extension = '.jpg' 
    return 'cache/images_upload/%s_%s%s' % (instance.pk, specname, extension) 

def generate_image_filename_1(instance, filename): 
    filename = '1' 
    extension = '.jpg' 
    return 'images_upload/%s_%s%s' % (instance.pk, filename, extension) 

class Model(models.Model): 
    name = models.CharField(max_length=40) 
    image_1 = ProcessedImageField([Adjust(contrast=1.2, sharpness=1.1), ResizeToFill(500, 370)], upload_to=generate_image_filename_1, format='JPEG', options={'quality': 90}) 
    thumbnail_1 = ImageSpec([Adjust(contrast=1.2, sharpness=1.1), ResizeToFill(83, 78)], image_field='image_1', cache_to=generate_cache_filename, format='JPEG', options={'quality': 90}) 

形式(刪除的圖像當它被更換一個新):

if form.is_valid(): 
    form_image = form.cleaned_data['image_1'] 
     try: 
      details = Model.objects.get(pk=pk) 
      if details.image_1 != form_image: 
       details.image_1.delete(save=False) 
     except Model.DoesNotExist: 
      pass 
     form.save() 

重命名圖像並替換image_1(=加載新的和刪除舊的)的部分工作得很好。但由於某些原因,緩存中的thumbnail_1不會刷新(=仍舊是舊圖像的縮略圖)。

我認爲它與表單中的刪除代碼有關,但我無法弄清楚爲什麼以及如何解決它。有人提出建議?

UPDATE 1:它也與'重命名'有關。我做了一些額外的測試:當我不重命名image_1文件,那麼一切工作正常(也刷新縮略圖)。但是當我加載另一個具有相同名稱的圖像時,則出現同樣的問題:image_1已更新,但thumbnail_1仍舊是舊圖像的縮略圖。

更新2:做了一些更多的測試和使用相同的文件名上傳新圖片的時候,我肯定在try進入if statement。所以舊的圖像被刪除。根據Imagekit的文檔,縮略圖也應該被刪除。但這種情況並非如此。

非常感謝!

+0

更新:做了一些更多的測試和使用相同的文件名上傳新圖片的時候,我肯定是在'try'進入'如果statement'。所以舊的圖像被刪除。根據Imagekit的文檔,縮略圖也應該被刪除。但這種情況並非如此。 –

回答

1

同時我找到了一個工作解決方案。 上述代碼不起作用的主要原因是由於緩存中的縮略圖在刪除原始圖像後未被刪除,尤其是在新圖像與前一個圖像具有相同文件名的情況下=>則縮略圖從未被刪除。 =>我仍然不知道爲什麼...,因爲我預計在刪除原始文件時總是會刪除緩存的圖像。

使用下面的代碼一切正常: 基本上我確信新上傳的形象一直另一名:

Model.py

def generate_cache_filename(instance, path, specname, extension): 
    extension = '.jpg' 
    return 'cache/images_upload/%s_%s%s' % (instance.pk, specname, extension) 
# generate random string of 10 characters 
def id_generator(size=10, chars=string.ascii_uppercase + string.digits): 
    return ''.join(random.choice(chars) for x in range(size)) 

def generate_random_filename(instance, filename): 
    filename = id_generator() 
    extension = '.jpg' 
return 'images_upload/%s_%s%s' % (instance.pk, filename, extension) 

class Model(models.Model): 
    name = models.CharField(max_length=20) 
    image_1 = ProcessedImageField([Adjust(contrast=1.2, sharpness=1.1), ResizeToFill(500, 370)], upload_to=generate_random_filename, format='JPEG', options={'quality': 90}) 
    thumbnail_1 = ImageSpec([Adjust(contrast=1.2, sharpness=1.1), ResizeToFill(83, 78)], image_field='image_1', cache_to=generate_cache_filename, format='JPEG', options={'quality': 90}) 

View.py:

# thanks to jdi for the help in the for-loop 
if form.is_valid(): 
     # A for loop is used here, because my database contains 5 images and 5    thumbnails 
     image_list = ['image_%d' % i for i in xrange(1,6)] 
     for image_name in image_list: 
      form_image = form.cleaned_data[image_name] 
      try: 
       details = Model.objects.get(pk=pk) 
       if getattr(details, image_name, None) != form_image: 
        getattr(details, image_name, None).delete(save=False) 
      except Model.DoesNotExist: 
       pass 

希望這可以幫助其他人。

親切的問候