在我的django应用程序中,我正在尝试调整大小和在将图像保存到数据库之前压缩图像。
以下是我在models
class Data(models.Model):
image = models.ImageField(upload_to='all_images/', null=True, blank=True)
def save(self, *args, **kwargs):
if self.image:
img = Image.open(self.image)
resize = img.resize((240, 240), Image.ANTIALIAS)
new_image = BytesIO()
resize.save(new_image, format=img.format, quality=80, save=False)
temp_name = os.path.split(self.image.name)[1]
self.image.save(temp_name, content=ContentFile(new_image.getvalue()), save=False)
super(Data, self).save(*args, **kwargs)
问题是,我将一个名为tesla.jpg
的图像保存到数据库中,然后将其压缩并放大。调整好了,但它重命名为tesla_CKBw0Kr_iWKC4Ry_ucPoh4b_BB2C8Ck_WrfWkPR_Tzig2T1_tdhst4b_3Bysn6k_i4ffhPR_yhig2T1.jpg
我担心新名称,因为通常它应该是tesla_CKBw0Kr.jpg
或更小的东西,所以我的代码和问题中的问题是什么?我们该如何解决这个问题?
答案 0 :(得分:1)
Django破坏了图像文件名,这样就不会在文件系统中遇到文件名冲突。如果您必须保存另一个名为tesla.jpg
的图像并且不希望它意外覆盖第一个图像,请考虑一下。
你不必担心这一点。 Django将真实的原始文件名存储在UploadeFile对象中。
<强>更新强>
如果您上传更多具有相同文件名的文件,Django将继续在文件名中添加随机字符:
https://github.com/django/django/blob/master/django/core/files/storage.py#L60-L89
如果您担心达到文件系统的文件名长度限制,请在ImageField上设置适当的max_length。然后,该函数将继续截断file_name并在文件名长度限制内生成新名称,直到找到一个空闲名称。