Django:上传的文件名问题

时间:2018-04-11 13:56:22

标签: django django-models

在我的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或更小的东西,所以我的代码和问题中的问题是什么?我们该如何解决这个问题?

1 个答案:

答案 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并在文件名长度限制内生成新名称,直到找到一个空闲名称。