Django upload-Datei in das bestimmte Verzeichnis, das hängt von der POST-URI
Möchte ich zum speichern von hochgeladenen Dateien in einem bestimmten Verzeichnis, das hängt von der URI des POST-Anfrage. Vielleicht würde ich auch gerne benennen Sie die Datei etwas fester (der name der Datei-Eingabe für Beispiel), so habe ich eine einfache Möglichkeit, grep die Datei-system, usw.. und auch um zu vermeiden, mögliche Sicherheitsprobleme.
Was ist der bevorzugte Weg, dies zu tun in Django?
Edit: ich sollte klarstellen, dass ich daran interessiert wären, möglicherweise dies zu tun, wie ein Datei-upload-handler zu vermeiden, das schreiben einer großen Datei zweimal, um die Datei system.
Edit2: ich vermute, man kann nur 'mv' der tmp-Datei an eine neue Position. Das ist eine billige operation, wenn auf das gleiche Dateisystem.
- das verschieben der temp-Datei ist ok. Django prüft in diesem Fall nicht beschweren, wenn es verloren geht: code.djangoproject.com/browser/django/trunk/django/core/files/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Django gibt Ihnen die totale Kontrolle darüber, wo (und wenn) Sie die Dateien speichern. Siehe: http://docs.djangoproject.com/en/dev/topics/http/file-uploads/
Das folgende Beispiel zeigt, wie kombinieren Sie die URL und den Namen der hochgeladenen Datei, und schreiben Sie die Datei auf die Festplatte:
Edit: Wie dies mit einem FileUploadHandler? Es verfolgt nach unten durch den code, und es scheint, wie Sie tun müssen, um vier Dinge zu nutzen, die TemporaryFileUploadHandler zu speichern, die außerhalb der FILE_UPLOAD_TEMP_DIR:
erweitern TemporaryUploadedFile und überschreiben init() zu übergeben, durch ein anderes Verzeichnis zu NamedTemporaryFile. Es kann mit der try mkdir außer pass ich oben zeigte.
erweitern TemporaryFileUploadHandler und überschreiben new_file (), um den obigen Klasse.
verlängern auch init() zu akzeptieren, das Verzeichnis, wo Sie möchten, den Ordner zu gehen.
Dynamisch hinzufügen der request-handler, indem Sie durch ein Verzeichnis bestimmt aus der URL:
Anfrage.upload_handlers = [ProgressBarUploadHandler(request.Pfad.ersetzen('/', '_')]
Während die nicht-trivial, es ist immer noch leichter als das schreiben eine Prozedur von vorne: In allem, werden Sie nicht haben, um zu schreiben eine einzige Zeile fehleranfällig gepuffert Lesen. Die Schritte 3 und 4 notwendig sind, weil FileUploadHandlers nicht bestanden sind Informationen anfordern, die standardmäßig ist, glaube ich, so werden Sie sagen, es wird getrennt, wenn Sie wollen, verwenden Sie die URL irgendwie.
Kann ich nicht wirklich empfehlen, das schreiben eines benutzerdefinierten FileUploadHandler für diese. Es ist wirklich mischen Schichten von Verantwortung. Relativ zu der Geschwindigkeit der Upload einer Datei über das internet, dabei eine lokale Kopie der Datei ist unerheblich. Und wenn die Datei ist klein, Django wird nur halten Sie in Erinnerung, ohne es auszuschreiben, um eine temp-Datei. Ich habe ein schlechtes Gefühl, dass Sie alle diese arbeiten und finden, können Sie auch nicht Messen, den Unterschied in der Leistung.
AttributeError: 'file' object has no attribute 'chunks'
from .forms import UploadFileForm
from somewhere import handle_uploaded_file
Festen olooney Beispiel. Es funktioniert jetzt