16

そのため、以前の質問に対する回答の実装に取り​​組んでいます。

これが私のモデルです:

class Talk(models.Model):
  title        = models.CharField(max_length=200)
  mp3          = models.FileField(upload_to = u'talks/', max_length=200)

これが私のフォームです:

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

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())

変異原性に何か問題がありますか、それとも間違っていますか?

判じ絵の答えの後

次のように、クラス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)

送信を押すと、次のエラー 500 が表示されます。

アップロードが処理された後は、アップロード ハンドラを設定できません。

できる限り早くやっているのに!

saveまた、取得しているオブジェクトにメソッドがあるかどうかもわかりません(dir(self.files['mp3'].file)とを調べましたdir(self.files['mp3']))。

4

1 に答える 1

30

FILE_UPLOAD_HANDLERSを次のように変更して、Django が常に一時ファイル ハンドラを使用するようにすることもできます。

FILE_UPLOAD_HANDLERSデフォルト:

("django.core.files.uploadhandler.MemoryFileUploadHandler",
 "django.core.files.uploadhandler.TemporaryFileUploadHandler",)

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'])}

この方法でディスクに保存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))

ファイルをMEDIA_ROOTに保存していることに注意してください。他の場所に保存しようとすると、書き込み可能な場所に制限があるため、SuspiciousOperationが表示されます...調べた後、このファイルを削除する必要があります。本物はあなたのものですモデル...

path = default_storage.delete('tmp/somename.mp3')
于 2010-05-10T21:41:59.940 に答える