【问题标题】:Django File Storage: Add passwords to file namesDjango 文件存储:为文件名添加密码
【发布时间】:2017-01-20 17:24:04
【问题描述】:

我们使用 Python Django。

我想通过以下方式存储用户上传的文件:

/<INTEGER>/<HASH>/<FILE>

<INTEGER> 是一个子文件夹,最多可包含 1000 个文件。

<HASH> 是每个文件的密码,以防止黑客从我们的 HTTPS 服务器下载某人的其他文件。

<FILE> 是文件名。

如何编写一个 Django 存储来实现这个?

首先,我可以从django.core.files.storage.FileSystemStorage 派生我的类还是需要直接从django.core.files.storage.Storage 派生?

其次,我应该重写哪些方法?我应该覆盖save 吗?似乎是的,因为最好只在保存时生成哈希,但我不确定我可以在save 中做我需要的事情。覆盖_save 怎么样?另外:覆盖get_available_name 和/或generate_filename 是怎么回事?它们似乎不太适合我的需要,因为最好仅在实际保存文件时生成哈希,而不仅仅是在考虑文件名时。

那么,该怎么办?

【问题讨论】:

  • 我会将<PASSWORD> 改写为<HASH>,因为它令人困惑且有点危险:)
  • 您可能不希望仅针对敏感的上传对全局所有上传执行此操作,您可以通过编写自己的 upload_to 函数在每个字段的基础上执行此操作。跨度>
  • @Anonymous 我希望通过将 所有 上传文件放入具有秘密名称的目录中来保护它们。

标签: django django-storage


【解决方案1】:

我会在django.core.files.storage.FileSystemStorage 中选择generate_filename。我觉得它更合适,因为我在get_available_name 中仍然有很好的安全垫。 如果文件没有被保存,我也不会担心获取文件名,只需要确保哈希生成足够便宜。


# settings.py

DEFAULT_FILE_STORAGE = 'app.storage.CustomStorage'

# app/storage.py

from datetime import datetime
import hashlib
import random

from django.core.files.storage import FileSystemStorage


class CustomStorage(FileSystemStorage):
    def generate_filename(self, filename):
        # implement smarter hash creation method here
        some_hash = hashlib.md5('{}-{}'.format('filename', datetime.now().isoformat())).hexdigest()

        return '{0}/{1}/{2}'.format(random.randint(0, 1000), some_hash, filename)

【讨论】:

    【解决方案2】:

    我想你可以有自己的函数来处理你想要创建文件夹结构的方式,你可以在 models.py 中作为
    attachment = models.FileField(upload_to=change_file_path, blank=True, null=True )
    其中 change_file_path 是您创建所需文件夹结构的自定义函数

    【讨论】:

    • 这不是一个解决方案: 1. 哈希是上传文件时生成的唯一字符串,每个文件都有单独的。 2. 它应该适用于 every FileField,而不是为每个文件单独设置。所以我需要创建一个自定义存储,而不是手动设置upload_to
    【解决方案3】:

    同时使用storageupload_to 参数来设置上传目录。更多信息FileField django docs

    这里我使用 uuid 作为<HASH>您可以使用自己的哈希生成器进行更改),在 Django 模型中,max_num 是 <integer>,而 senfile 是 <FILE>

    模型.py

    from django.core.files.storage import FileSystemStorage
    import uuid
    
    storeFile = FileSystemStorage(location='SensitiveFiles/')
    
    def content_file_upload(instance, filename):
        return '{0}/{1}/{2}'.format(instance.max_num,str(uuid.uuid4()), filename)
    
    class SensitiveFiles(models.Model):
        user = models.ForeignKey(User)
        senfile = models.FileField(storage=storeFile,upload_to=content_file_upload,validators=[validation_for_max_num_files])
        max_num=models.IntegerField(default=1000)
    
        def get_file_url(self):
            return self.senfile.url
    

    创建您的验证器以检查上传目录中的当前文件数。

    【讨论】:

    • 这不是一个解决方案: 1. 哈希是上传文件时生成的唯一字符串,每个文件都有单独的。 2. 它应该适用于 every FileField,而不是为每个文件单独设置。所以我需要创建一个自定义存储,而不仅仅是手动设置upload_to
    猜你喜欢
    • 2021-04-23
    • 1970-01-01
    • 2011-10-24
    • 2013-01-17
    • 2019-06-19
    • 1970-01-01
    • 2017-02-03
    • 1970-01-01
    • 2020-06-16
    相关资源
    最近更新 更多