使用 django 强制上传文件名唯一?
使用 django 在上传照片时在服务器上使用唯一文件名重命名照片的最佳方法是什么?我想确保每个名称仅使用一次。有没有任何 pinax 应用程序可以做到这一点,也许可以使用 GUID?
What's the best way to rename photos with a unique filename on the server as they are uploaded, using django? I want to make sure each name is used only once. Are there any pinax apps that can do this, perhaps with GUID?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
如何将文件名与上传照片的日期/时间连接起来,然后使用 hashlib 创建消息摘要?这应该会给你唯一的文件名。
或者,您可以重新使用 一个简洁的小片段,它创建唯一的文件名,然后使用该文件的完整路径作为哈希调用的输入。这为您提供了独特的恒定长度字符串,您可以将其映射到您的文件。
How about concatenating the filename with the date / time the photo was uploaded and then using hashlib to create a message digest? That should give you unique filenames.
Alternatively you could re-use a neat little snippet which creates unique filenames and then use the full path to that file as the input to your hash call. That gives you unique constant length strings which you can map to your files.
django 自动强制执行唯一的文件名。
如果文件已经存在,则会将七个唯一字符附加到
在 django 2.2 上测试的文件名中
django enforce unique filename automatically.
if the file already exists, seven unique characters are appended to the filename
tested on django 2.2
使用 uuid。要将其绑定到您的模型中,请参阅 Django FileField upload_to 的文档。
例如,在 models.py 中定义以下函数:
然后,在定义 FileField/ImageField 时,指定
get_file_path
作为upload_to
值。Use uuid. To tie that into your model see Django documentation for FileField upload_to.
For example in your models.py define the following function:
Then, when defining your FileField/ImageField, specify
get_file_path
as theupload_to
value.更好的方法可能是在 helpers.py 中使用公共类。这样您就可以在您的应用程序中重复使用随机文件生成器。
在你的helpers.py中:
然后在你的模型中只需导入助手类:
然后使用它:
参考:https://coderwall.com/p/hfgoiw/give-imagefield-uploads-a-unique-name-to-avoid-file-overwrites
A better way could be using a common class in your helpers.py. This way you could reuse the random file generator across your apps.
In your helpers.py:
And then in your model just import the helper class:
And then use it:
Ref: https://coderwall.com/p/hfgoiw/give-imagefield-uploads-a-unique-name-to-avoid-file-overwrites
在撰写本答案时,您似乎不再需要做任何特别的事情来实现这一点。如果你设置一个带有静态
upload_to
属性的FileField
,Django存储系统将自动管理命名,这样如果上传了重复的文件名,Django将随机生成一个新的唯一的文件名。副本的文件名。适用于 Django 1.10。
As of the writing of this answer it seems like you no longer need to do anything special to make this happen. If you set up a
FileField
with a staticupload_to
property, the Django storage system will automatically manage naming so that if a duplicate filename is uploaded, Django will randomly generate a new unique filename for the duplicate.Works on Django 1.10.
在 Django 1.6.6、1.5.9 和 1.4.14 之前,
get_avaialable_name
函数会通过添加下划线自动为文件提供唯一的名称。因此,例如,如果您将一个文件“test.jpg”保存到服务器,然后将另一个文件“test.jpg”保存到服务器,则第一个文件将称为 test.jpg,第二个文件将称为 test_1.jpg。唉,事实证明,这是对机器进行 DDOS 攻击的一个载体,通过向机器发送数千个零字节文件来存储,每个文件检查数千个以前的文件以查看其名称应该是什么。
正如您看到的在文档中,新系统在下划线后附加七个随机数字来解决此问题。
Prior to Django 1.6.6, 1.5.9, and 1.4.14, the
get_avaialable_name
function would automatically give files a unique name by adding an underscore. So, for example, if you save one file "test.jpg" and then another file, "test.jpg" to your server, the first will be called test.jpg, and the second will be called test_1.jpg.Alas, that turns out to be a vector for DDOSing a machine, by sending it thousands of zero-byte files to store, each one checking thousands of previous files to see what its name should be.
As you'll see in the docs, the new system appends seven random digits after the underscore to fix this problem.
您可以编写自己的
FileField
并覆盖generate_filename
。例如:
You can write your own
FileField
and overridegenerate_filename
.For example: