我试图捕获一个与表单一起发送的文件,并在保存之前对其执行一些操作.所以我需要在临时目录中创建此文件的副本,但我不知道如何到达它.Shutil的功能无法复制此文件,因为没有路径.那么有没有办法以其他方式进行此操作?
我的代码:
image = form.cleaned_data['image']
temp = os.path.join(settings.PROJECT_PATH, 'tmp')
sourceFile = image.name # without .name here it wasn't working either
import shutil
shutil.copy(sourceFile, temp)
Run Code Online (Sandbox Code Playgroud)
哪个提出:
Exception Type: IOError at /
Exception Value: (2, 'No such file or directory')
调试:
# (..)\views.py in function
67. sourceFile = image.name
68. import shutil
69. shutil.copy2(sourceFile, temp) ...
# (..)\Python26\lib\shutil.py in copy2
92. """Copy data and all stat info ("cp -p src dst").
93.
94. The destination may be a directory.
95.
96. """ …Run Code Online (Sandbox Code Playgroud) 所以,我正在努力实现我之前的问题的答案.
这是我的模特:
class Talk(models.Model):
title = models.CharField(max_length=200)
mp3 = models.FileField(upload_to = u'talks/', max_length=200)
Run Code Online (Sandbox Code Playgroud)
这是我的表格:
class TalkForm(forms.ModelForm):
def clean(self):
super(TalkForm, self).clean()
cleaned_data = self.cleaned_data
if u'mp3' in self.files:
from mutagen.mp3 import MP3
if hasattr(self.files['mp3'], 'temporary_file_path'):
audio = MP3(self.files['mp3'].temporary_file_path())
else:
# What goes here?
audio = None # setting to None for now
...
return cleaned_data
class Meta:
model = Talk
Run Code Online (Sandbox Code Playgroud)
Mutagen在磁盘上需要类似文件的对象或文件名(我认为) - 第一种情况(上传的文件大于内存中处理的文件大小)工作正常,但我不知道如何处理InMemoryUploadedFile我得到的其他情况.我试过了:
# TypeError (coercing to Unicode: need string or buffer, InMemoryUploadedFile found) …Run Code Online (Sandbox Code Playgroud) 上下文:我想获取用户上传的文件,将其附加到模型,更改一些属性,然后将对象保存到数据库。
这是一些相关的代码:
模型.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 的位置。 …