gpt4 book ai didi

Django rest Framework,更改ImageField的文件名

转载 作者:行者123 更新时间:2023-12-02 01:03:50 25 4
gpt4 key购买 nike

我有一个带有 Django Rest Framework 的 API 端点来上传图像。

class MyImageSerializer(serializers.ModelSerializer):
image = serializers.ImageField(source='image')

我可以上传图片,但它们是用客户端发送的文件名保存的,这可能会导致冲突。我想改为使用时间戳文件名将文件上传到我的 CDN。

生成文件名不是问题,只是用它保存图像。

有人知道怎么做吗?谢谢。

最佳答案

如果您的图像类型为 ImageField来自django,那么你真的不需要做任何事情,甚至不需要像你那样在你的序列化程序中声明它。将它添加到 fields 属性中就足够了,django 将处理冲突。这意味着 django 将在每个可能产生冲突的新文件上添加 _index,因此如果您上传一个名为 'my_pic.jpg' 的文件 5 次,您实际上将拥有文件 'my_pic.jpg', ' my_pic_1.jpg'、'my_pic_2.jpg'、'my_pic_3.jpg'、'my_pic_4.jpg' 在您的服务器上。

现在,这是使用 Django 的 FileSystemStorage 实现完成的(参见 here ),但是如果您希望它在您的文件名后附加一个时间戳,您所要做的就是编写一个存储类,在其中覆盖 get_available_name(name) 方法。示例:

class MyFileSystemStorage(FileSystemStorage):
def get_available_name(self, name):
''' name is the current file name '''
now = time.time()
stamp = datetime.datetime.fromtimestamp(now).strftime('%Y-%m-%d-%H-%M-%S')
return '{0}_{1}'.format(name, str(stamp))

以及模型中的图像字段:

image = models.ImageField(upload_to='your upload dir', storage= MyFileSystemStorage)

重要更新

自 2014 年 8 月 20 日起,这不再是问题,因为 Django found a vulnerability related to this behaviour (感谢@mlissner 指出)。重要摘录:

We’ve remedied the issue by changing the algorithm for generating file names if a file with the uploaded name already exists. Storage.get_available_name() now appends an underscore plus a random 7 character alphanumeric string (e.g. "_x3a1gho"), rather than iterating through an underscore followed by a number (e.g. "_1", "_2", etc.).

关于Django rest Framework,更改ImageField的文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25128758/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com