我正在構建一個Django項目,用戶可以在其中上傳圖片。我想知道我應該怎麼做才能不顯示原始圖片的名稱。如何在Django中不顯示原始圖片名稱
我想要的網址是類似於/ pic/randomnumber,並且當圖片從網站下載時,它的名稱爲randomnumber.jpg。例如,Tumblr上的所有圖片的名稱都是tumblr_blabla.jpg。
我認爲這應該在models.py中完成,但我不太清楚如何實現它。
我正在構建一個Django項目,用戶可以在其中上傳圖片。我想知道我應該怎麼做才能不顯示原始圖片的名稱。如何在Django中不顯示原始圖片名稱
我想要的網址是類似於/ pic/randomnumber,並且當圖片從網站下載時,它的名稱爲randomnumber.jpg。例如,Tumblr上的所有圖片的名稱都是tumblr_blabla.jpg。
我認爲這應該在models.py中完成,但我不太清楚如何實現它。
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)
在模型中定義的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'))
希望這有助於!