小编Pus*_*uel的帖子

在 Django 中通过哈希有效地保存文件

我正在做一个 Django 项目。我希望用户能够做的是上传文件(通过表单),然后将文件本地保存到自定义路径并使用自定义文件名 - 它的哈希。我能想到的唯一解决方案是使用我正在使用的 FileField 的“upload_to”参数。这意味着什么(我认为):

1) 将文件写入磁盘

2) 计算哈希

3)返回路径+哈希作为文件名

问题在于有两种写操作:一种是将文件从内存保存到磁盘以计算哈希值,另一种是将文件实际保存到指定位置时。

有没有办法覆盖 FileField 的保存到磁盘方法(或者我在哪里可以找到幕后发生的事情),以便我基本上可以使用临时名称保存文件,然后将其重命名为哈希,而不是保存它两次。

谢谢。

python django hash

6
推荐指数
2
解决办法
6308
查看次数

使用 commit=False 调用 save() 时未调用 Django 的 FileField“upload_to”方法

上下文:我想获取用户上传的文件,将其附加到模型,更改一些属性,然后将对象保存到数据库。

这是一些相关的代码:

模型.py

def file_upload_path(instance, filename):
    path = os.path.join('uploaded_files', str(uuid4()))
    return path 

class UploadedFile(models.Model):
    file_object = models.FileField(null=False, blank=False,
                                   upload_to=file_upload_path)

    def __unicode__(self):
        return self.file_object.name
Run Code Online (Sandbox Code Playgroud)

表格.py

class UploadFileForm(forms.ModelForm):
    class Meta:
        model = UploadedFile
        fields = ['file_object']
Run Code Online (Sandbox Code Playgroud)

视图.py

def home(request):
...
        if form.is_valid():
            new_file = form.save(commit=True)

            print new_file
...
Run Code Online (Sandbox Code Playgroud)

这段代码准确地打印出我想要的内容,即调用upload_to 并将文件保存到所述位置后的文件路径(例如“uploaded_files/b992e44e-6403-4c37-82b4-b3c403d07f79”)。

现在,有了这个 views.py,事情发生了变化:

视图.py

def home(request):
...
        if form.is_valid():
            new_file = form.save(commit=False)

            print new_file

            # new_file_object = FileObject(os.path.abspath(new_file.file_object.url))
            # new_file.mime_type = new_file_object.get_mime_type()
...
Run Code Online (Sandbox Code Playgroud)

我得到的不是路径,而是原始文件名(例如“jnes.exe”),因此我无法处理该文件,因此我可以获取其 mime 类型,例如,然后更新模型并将其保存到数据库中。

任何想法我做错了什么?谢谢。

我是如何解决它的:

我对仍在内存中/临时在磁盘上的文件进行必要的模型编辑,因为 Django 不允许您在实际保存新模型实例之前直接找到 FileField 的位置。 …

python django

5
推荐指数
1
解决办法
1217
查看次数

标签 统计

django ×2

python ×2

hash ×1