zjm*_*126 52 python django file-rename pinax
使用django上传服务器时,使用唯一文件名重命名照片的最佳方法是什么?我想确保每个名称只使用一次.是否有任何pinax应用程序可以做到这一点,也许与GUID?
Nat*_*han 130
使用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)
Run Code Online (Sandbox Code Playgroud)
然后,在定义FileField/ImageField时,指定get_file_path
为upload_to
值.
file = models.FileField(upload_to=get_file_path,
null=True,
blank=True,
verbose_name=_(u'Contact list'))
Run Code Online (Sandbox Code Playgroud)
Rap*_*tor 12
更好的方法是在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)
Run Code Online (Sandbox Code Playgroud)
然后在你的模型中导入辅助类:
from mymodule.helpers import RandomFileName
Run Code Online (Sandbox Code Playgroud)
然后使用它:
logo = models.ImageField(upload_to=RandomFileName('logos'))
Run Code Online (Sandbox Code Playgroud)
参考:https://coderwall.com/p/hfgoiw/give-imagefield-uploads-a-unique-name-to-avoid-file-overwrites
mli*_*ner 10
在Django 1.6.6,1.5.9和1.4.14之前,该get_avaialable_name
函数会通过添加下划线自动为文件指定唯一名称.因此,例如,如果您将一个文件"test.jpg"和另一个文件"test.jpg"保存到您的服务器,第一个将被称为test.jpg,第二个将被称为test_1.jpg.
唉,结果是DDOS一台机器的向量,通过发送数千个零字节文件进行存储,每个文件检查数千个以前的文件,看看它的名字应该是什么.
正如您在文档中看到的那样,新系统在下划线后面附加七个随机数字来解决此问题.
在撰写此答案时,您似乎不再需要做任何特别的事情来实现这一目标。如果你设置了一个FileField
静态upload_to
属性,Django 存储系统会自动管理命名,这样如果上传重复的文件名,Django 会随机生成一个新的唯一文件名。
适用于 Django 1.10。
归档时间: |
|
查看次数: |
26419 次 |
最近记录: |