2014-02-25 74 views
0

我正在構建一個Django項目,用戶可以在其中上傳圖片。我想知道我應該怎麼做才能不顯示原始圖片的名稱。如何在Django中不顯示原始圖片名稱

我想要的網址是類似於/ pic/randomnumber,並且當圖片從網站下載時,它的名稱爲randomnumber.jpg。例如,Tumblr上的所有圖片的名稱都是tumblr_blabla.jpg。

我認爲這應該在models.py中完成,但我不太清楚如何實現它。

回答

0

IMO你應該在你的模型編寫方法保存 類似的東西:

from PIL import Image 
import os 


class YOURS_MODEL_NAME(models.Model): 
    photo = models.ImageField(upload_to="photos") 
    def save(self, miniature=True): 
     super(YOURS_MODEL_NAME, self).save() 
     if miniature: 
      filepath = self.photo.path 


      image = Image.open(filepath)   
      new_filepath = filepath.split('.') 
      new_filepath = '.'.join("HERE YOU CAN ADD EVERYTHING TO PATH TO THIS PHOTO") + "." + new_filepath[-1].lower() 

      try: 
       image.save(new_filepath, quality=90, optimize=1) 
      except: 
       image.save(new_filepath, quality=90) 

      photo_name = self.photo.name.split('.') 
      photo_name = '.'.join("HERE YOU CAN ADD EVERYTHING YOU WANT TO 'PHOTO NAME'") + "." + photo_name[-1].lower() 
      self.photo = photo_name 

      self.save(miniature=False) 

      # remove old image 
      os.remove(filepath) 
0

在模型中定義的upload_to參數可以是您使用自定義文件名的可調用函數。從Django文檔採取 FileField(其中ImageField的是一個子類):

upload_to有兩個參數:實例(其中文件名是原始文件名,你也可以選擇忽略)。與此類似

東西在models.py應該做的伎倆:

def random_filename(instance, filename): 

    file_name = "random_string" # use your choice for generating a random string! 

    return file_name 


class SomeModel(models.Model): 
    file = models.ImageField(upload_to=random_filename) 

(這類似於答案this question about FileFields)。

如果您要走這條路,我會建議您使用文件上傳的散列/校驗和或日期/時間。沿着這些線應該工作(雖然我沒有自己測試過!):

from hashlib import sha1 

def unique_filename(instance, field): 

    filehash = sha1() 

    for chunk in getattr(instance, field).chunks(): 
     filehash.update(chunk) 

    return filehash 

class SomeModel(models.Model): 
    file = models.ImageField(upload_to=unique_filename(field='file')) 

希望這有助於!