Django |提供两个上传的图片版本-WebP和JPEG



我只想向您请教一个最佳实践,即如何通过Django向用户提供WebP和JPEG图像。

我有一个关于车辆的网站——每天大约增加1000辆车,每辆车大约有10张图片。这是很多图像。我有一个习惯";import-django管理命令";,解析车辆:

  1. 它从源下载JPEG图像(单车10张图像(
  2. 然后对所有下载的图像应用水印
  3. 之后,该图像被转换为WebP格式,并通过Django上传到Images表,该表具有车辆的ForeignKey(我使用ImageField(
  4. 然后它压缩原始JPEG图像,并通过shutil.move将这些压缩的JPEG图像移动到存储WebP图像格式的同一文件夹中

因为我使用的是AMP HTML,所以我可以简单地为浏览器从WebP回退到JPEG,因为它不支持WebP。因为图像在同一个/media/…/文件夹,它工作得很好。

但今天我发现,这种方法并不完美。当有相同的图像名称时,Django在save((方法get_random_string((法中,它在文件末尾生成额外的7个字符https://github.com/django/django/blob/master/django/utils/crypto.py

所以我的shuitl.move((方法失败了:

shutil.Error: Destination path '/home/django/exampleproject/media/2020/12/10/example-compressed-image-img01.jpg' already exists

我不知道,如何弄清楚,如何为这个JPEG文件获得相同的名称——如何在文件末尾获得这个散列。文件名必须相同-对于WebP和JPEG,唯一的扩展名必须不同。当然,我可以列出所有文件,找到这些哈希并尝试附加它们。。。但我认为,这种方法并不完美。

最好的方法是只使用WebP图像,但不是所有浏览器都支持它。对我来说,使用WebP非常重要,因为SEO-它在文件名中有关键字。

有没有更好的方法,如何将ImageField中的WebP和JPEG图像保存到相同的upload_to目录中,并使用相同的名称(当文件名已经存在时,Django会重命名它(?我不想使用两个表或两列,因为这是一个很大的字符串,如果我将来有10M以上的记录,那么DB中就会有很多数据。

如果有什么建议,我会很高兴的,谢谢!

我已经通过在文件名中插入uuid来解决类似的问题。这是一个例子。使用django强制执行唯一的上传文件名?

另一种选择是上传到S3,S3将根据需要自动创建唯一的文件名,然后对新上传的文件运行lambda函数以生成第二个图像&filename。

最新更新