我正在做一个 Django 项目。我希望用户能够做的是上传文件(通过表单),然后将文件本地保存到自定义路径并使用自定义文件名 - 它的哈希。我能想到的唯一解决方案是使用我正在使用的 FileField 的“upload_to”参数。这意味着什么(我认为):
1) 将文件写入磁盘
2) 计算哈希
3)返回路径+哈希作为文件名
问题在于有两种写操作:一种是将文件从内存保存到磁盘以计算哈希值,另一种是将文件实际保存到指定位置时。
有没有办法覆盖 FileField 的保存到磁盘方法(或者我在哪里可以找到幕后发生的事情),以便我基本上可以使用临时名称保存文件,然后将其重命名为哈希,而不是保存它两次。
谢谢。
上下文:我想获取用户上传的文件,将其附加到模型,更改一些属性,然后将对象保存到数据库。
这是一些相关的代码:
模型.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 的位置。 …