Lesen Dateidaten während saubere Methode des Formulars
-
25-09-2019 - |
Frage
Also, ich arbeite die Antwort auf meine vorherige Frage an der Umsetzung .
Hier ist mein Modell:
class Talk(models.Model):
title = models.CharField(max_length=200)
mp3 = models.FileField(upload_to = u'talks/', max_length=200)
Hier ist meine Form:
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 braucht dateiähnliche Objekte oder Dateinamen auf der Festplatte (I < em> denkt ) - der erste Fall (in dem die hochgeladene Datei größer als die Größe der Datei im Speicher behandelt ist) funktioniert gut, aber ich weiß nicht, wie InMemoryUploadedFile
zu handhaben, dass ich sonst bekommen. Ich habe versucht:
# 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())
Gibt es etwas falsch mit Mutagen, oder bin ich es falsch?
Nach Rebus' Antwort
Ändern der FILE_UPLOAD_HANDLERS
Einstellung on the fly in meiner ModelAdmin
Klasse wie folgt:
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)
Ruft mir die folgende Störung 500, wenn ich einreichen getroffen:
Sie können die Upload-Handler nicht gesetzt, nachdem der Upload verarbeitet wurde.
obwohl ich mache es so früh wie ich nur kann!
Auch ich bin nicht sicher, habe ich eine save
Methode für das Objekt bekam ich bin immer wieder (ich habe in dir(self.files['mp3'].file)
und dir(self.files['mp3'])
sah).
Lösung
Sie könnten versuchen, Ihren FILE_UPLOAD_HANDLERS ändern a> so so Django verwendet immer temporay Datei-Handler:
FILE_UPLOAD_HANDLERS
default:
("django.core.files.uploadhandler.MemoryFileUploadHandler",
"django.core.files.uploadhandler.TemporaryFileUploadHandler",)
So Sie nur TemporaryFileUploadHandler
durch Überschreiben der Einstellung Ihrer settings.py verlassen können.
Edit:
Viel einfacher haben es in erster Linie gedacht sollte: (:
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'])}
Sie können InMemoryUploadedFile
auf die Platte auf diese Weise speichern und verwenden Sie dann den Pfad zu dieser Datei an der Arbeit mit mutagen
.
Edit:
Das Gleiche gilt ohne Modelle Instanz.
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))
Beachten Sie, dass es die Datei in MEDIA_ROOT rettende, wenn ich versuche, es anderswo zu speichern i get SuspiciousOperation da gibt es Grenzen, wo Sie schreiben können ... Sie sollten diese Datei löschen, nachdem sie die Prüfung i die reale Sache auf Ihrem Modell sein erraten, wird ...
path = default_storage.delete('tmp/somename.mp3')