我正在构建一个用户可以上传图片的Django项目。我想知道如何不显示原始图片名称。
我希望网址类似于/ pic / randomnumber,当从网站下载图片时,它的名称为randomnumber.jpg。例如,Tumblr上的所有图片都有名称tumblr_blabla.jpg。
我认为这应该是在models.py中完成的,但我不太清楚如何实现它。
答案 0 :(得分: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)
答案 1 :(得分:0)
模型定义中的upload_to
参数可以是一个可调用函数,可用于自定义文件名。取自Django文档
FileField(其中ImageField是子类):
upload_to 有两个参数: instance 和 filename ,(其中 filename 是原始文件名,你是也可以选择忽略)。
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'))
希望这有帮助!