使用 django 强制执行唯一的上传文件名?

新手上路,请多包涵

使用 django 在上传服务器时使用唯一文件名重命名照片的最佳方法是什么?我想确保每个名称只使用一次。是否有可以使用 GUID 执行此操作的任何 pinax 应用程序?

原文由 zjm1126 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 374
2 个回答

使用uuid。要将其绑定到您的模型中,请参阅 FileField upload_to 的 Django 文档

例如在您的 models.py 中定义以下函数:

 import uuid
import os

def get_file_path(instance, filename):
    ext = filename.split('.')[-1]
    filename = "%s.%s" % (uuid.uuid4(), ext)
    return os.path.join('uploads/logos', filename)

然后,在定义 FileField/ImageField 时,将 get_file_path 指定为 upload_to 值。

 file = models.FileField(upload_to=get_file_path,
                        null=True,
                        blank=True,
                        verbose_name=_(u'Contact list'))

原文由 Nathan 发布,翻译遵循 CC BY-SA 3.0 许可协议

更好的方法是在 helpers.py 中使用通用类。这样您就可以在您的应用程序中重复使用随机文件生成器。

在你的 helpers.py 中:

 import os
import uuid
from django.utils.deconstruct import deconstructible

@deconstructible
class RandomFileName(object):
    def __init__(self, path):
        self.path = os.path.join(path, "%s%s")

    def __call__(self, _, filename):
        # @note It's up to the validators to check if it's the correct file type in name or if one even exist.
        extension = os.path.splitext(filename)[1]
        return self.path % (uuid.uuid4(), extension)

然后在你的模型中导入辅助类:

 from mymodule.helpers import RandomFileName

然后使用它:

 logo = models.ImageField(upload_to=RandomFileName('logos'))

参考: https ://coderwall.com/p/hfgoiw/give-imagefield-uploads-a-unique-name-to-avoid-file-overwrites

原文由 Raptor 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏