django 自定义图片上传路径和上传文件名

本文介绍如何在Django中自定义图片上传的文件名,避免文件名重复导致的图片覆盖问题。通过使用UUID和指定上传路径,可以确保每个上传的图片都有唯一的文件名。

图片上传中,如果不对上传的文件名做处理,很容易引起文件名重复,这会覆盖之前上传的图片,django提供了自定义上传文件名的方法。

    def generate_filename(self, instance, filename):
        """
        Apply (if callable) or prepend (if a string) upload_to to the filename,
        then delegate further processing of the name to the storage backend.
        Until the storage layer, all file paths are expected to be Unix style
        (with forward slashes).
        """
        if callable(self.upload_to):
            filename = self.upload_to(instance, filename)
        else:
            dirname = datetime.datetime.now().strftime(self.upload_to)
            filename = posixpath.join(dirname, filename)
        return self.storage.generate_filename(filename)

上面的代码是django中对ImageField上传时,生成文件名的处理方式。如果 upload_to 的参数是可调用的,则直接调用来生成文件名(包括静态文件夹后的文件路径)。要自定义上传文件名就从这里着手。

import uuid

from django.db import models


def image_upload_to(instance, filename):
    return 'original_image/{uuid}/{filename}'.format(uuid=uuid.uuid4().hex, filename=filename)


class TestImageUpload(models.Model):
    image = models.ImageField(upload_to=image_upload_to)

按照上面的方式,就可以按照自己的意愿随意的处理文件名了(函数的参数个数是固定的)。

### Django ImageKit 自定义上传文件名 为了实现自定义上传文件名的功能,在使用 `Django ImageKit` 处理图像时,可以通过创建一个继承自 `ImageSpecField` 或者其他相应字段类的新类来指定处理器以及存储选项。具体来说,可以利用 Python 的函数或 lambda 表达式来自动生成唯一的文件名称。 对于想要控制实际保存到磁盘上的文件命名逻辑的情况,应该重写 `generate_filename()` 方法。此方法接收两个参数:一个是实例对象 (`instance`);另一个是要处理的属性名 (`filename`)。通过这种方式可以在每次调用 save() 方法之前动态决定最终要使用的文件路径名字[^1]。 下面是一个简单的例子展示如何做到这一点: ```python from django.db import models from imagekit.models import ProcessedImageField, ImageSpecField import os from uuid import uuid4 def path_and_rename(instance, filename): upload_to = 'photos/' ext = filename.split('.')[-1] # get filename if instance.pk: filename = '{}.{}'.format(instance.pk, ext) else: # set filename as random string filename = '{}.{}'.format(uuid4().hex, ext) # return the whole path to the file return os.path.join(upload_to, filename) class MyModel(models.Model): avatar_original = ProcessedImageField( upload_to=path_and_rename, processors=[...], # your processors here format='JPEG', options={'quality': 60}, ) thumbnail = ImageSpecField( source='avatar_original', processors=[...], # your processors here format='JPEG', options={'quality': 90} ) ``` 在这个案例里,每当有新的照片被上传时都会生成一个新的随机字符串作为其文件名,并存放在名为 "photos/" 的子目录下。这不仅有助于防止同名冲突,同时也使得管理媒体资源更加容易[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值