Dom*_*ger 16 django django-file-upload mutagen
所以,我正在努力实现我之前的问题的答案.
这是我的模特:
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)
audio = MP3(self.files['mp3'])
# TypeError (coercing to Unicode: need string or buffer, cStringIO.StringO found)
audio = MP3(self.files['mp3'].file)
# Hangs seemingly indefinitely on my test file (~800KB)
audio = MP3(self.files['mp3'].file.read())
Run Code Online (Sandbox Code Playgroud)
mutagen有什么问题,或者我做错了吗?
FILE_UPLOAD_HANDLERS在我的ModelAdmin班级中动态修改设置,如下所示:
def add_view(self, request, form_url='', extra_context=None):
request.upload_handlers = [TemporaryFileUploadHandler()]
return super(TalkAdmin, self).add_view(request, form_url, extra_context)
Run Code Online (Sandbox Code Playgroud)
点击提交时,我收到以下错误500:
处理完上传后,您无法设置上传处理程序.
尽管我尽可能早地做到了!
另外,我不知道我有save我找回(我看了在对象上的方法dir(self.files['mp3'].file)和dir(self.files['mp3'])).
Dav*_*cic 25
您可以尝试以这种方式更改您的FILE_UPLOAD_HANDLERS,以便Django始终使用临时文件处理程序:
FILE_UPLOAD_HANDLERS 默认:
("django.core.files.uploadhandler.MemoryFileUploadHandler",
"django.core.files.uploadhandler.TemporaryFileUploadHandler",)
Run Code Online (Sandbox Code Playgroud)
因此,您只能TemporaryFileUploadHandler通过覆盖settings.py中的设置来离开.
编辑:
更简单,应该首先想到它:(:
from your.models import Talk
mp3 = self.files['mp3']
f = Talk.mp3.save('somename.mp3', mp3)
MP3(f.mp3.path)
>>> {'TRCK': TRCK(encoding=0, text=[u'5'])}
Run Code Online (Sandbox Code Playgroud)
您可以InMemoryUploadedFile通过这种方式保存到磁盘,然后使用该文件的路径进行操作mutagen.
编辑:
没有模型实例也是如此.
import os
from django.core.files.storage import default_storage
from django.core.files.base import ContentFile
from django.conf import settings
from mutagen.mp3 import MP3
mp3 = request.FILES['mp3'] # or self.files['mp3'] in your form
path = default_storage.save('tmp/somename.mp3', ContentFile(mp3.read()))
MP3(os.path.join(settings.MEDIA_ROOT, path))
Run Code Online (Sandbox Code Playgroud)
需要注意的是它节省MEDIA_ROOT文件,当我试图挽救它其他地方,我得到SuspiciousOperation因为是有限制的,你可以写检查......之后我想,真实的东西会在你应该删除这个文件你模型...
path = default_storage.delete('tmp/somename.mp3')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9440 次 |
| 最近记录: |