Django lädt die Datei in ein bestimmtes Verzeichnis, das vom POST-URI abhängt

8

Ich möchte hochgeladene Dateien in einem bestimmten Verzeichnis speichern, das vom URI der POST-Anfrage abhängig ist. Vielleicht möchte ich auch die Datei in etwas festes umbenennen (der Name der Datei-Eingabe zum Beispiel), so habe ich eine einfache Möglichkeit, das Dateisystem usw. zu grep und auch mögliche Sicherheitsprobleme zu vermeiden.

Was ist der bevorzugte Weg, dies in Django zu tun?

Bearbeiten: Ich sollte klarstellen, dass ich daran interessiert wäre, dies möglicherweise als Datei-Upload-Handler zu machen, um zu vermeiden, dass eine große Datei zweimal in das Dateisystem geschrieben wird.

Edit2: Ich nehme an, man kann die tmp-Datei einfach an einen neuen Ort 'mv' bringen. Das ist ein günstiger Vorgang, wenn es sich auf demselben Dateisystem befindet.

    
kmt 16.02.2010, 23:46
quelle

2 Antworten

3

Django gibt Ihnen die totale Kontrolle darüber, wo und wann Sie Dateien speichern. Siehe: Ссылка

Das folgende Beispiel zeigt, wie Sie die URL und den Namen der hochgeladenen Datei kombinieren und die Datei auf die Festplatte schreiben:

%Vor%

Bearbeiten: Wie geht das mit einem FileUploadHandler? Es wurde durch den Code verfolgt und es scheint, als müssten Sie vier Dinge tun, um den TemporaryFileUploadHandler für das Speichern außerhalb von FILE_UPLOAD_TEMP_DIR zu verwenden:

  1. Erweitern TemporaryUploadedFile und überschreiben Sie init (), um ein anderes Verzeichnis an NamedTemporaryFile zu übergeben. Es kann das try mkdir verwenden, außer dem Pass, den ich oben gezeigt habe.

  2. Erweitern Sie TemporaryFileUploadHandler und überschreiben Sie new_file ( ) um die obige Klasse zu verwenden.

  3. erweitern Sie auch init (), um das Verzeichnis zu akzeptieren, in das der Ordner verschoben werden soll.

  4. Fügen Sie den Request-Handler dynamisch hinzu, indem Sie ein Verzeichnis durchlaufen, das anhand der URL ermittelt wurde:

    request.upload_handlers = [ProgressBarUploadHandler (request.path.replace ('/', '_')]

Das ist zwar nicht trivial, aber immer noch einfacher als einen Handler von Grund auf neu zu schreiben: Insbesondere müssen Sie keine einzelne Zeile fehlerbehafteten gepufferten Lesens schreiben. Die Schritte 3 und 4 sind erforderlich, da FileUploadHandlers standardmäßig keine Anforderungsinformationen übergeben werden. Daher müssen Sie es separat angeben, wenn Sie die URL irgendwie verwenden möchten.

Ich kann nicht wirklich empfehlen, einen benutzerdefinierten FileUploadHandler dafür zu schreiben. Es vermischt wirklich Ebenen der Verantwortung. Relativ zur Geschwindigkeit des Hochladens einer Datei über das Internet ist das Ausführen einer lokalen Dateikopie unbedeutend. Und wenn die Datei klein ist, wird Django sie nur im Speicher behalten, ohne sie in eine temporäre Datei zu schreiben. Ich habe das schlechte Gefühl, dass das alles funktioniert und dass man den Leistungsunterschied nicht einmal messen kann.

    
olooney 17.02.2010, 00:08
quelle
8

Problem mit olooney behoben. Es funktioniert jetzt

%Vor%     
user2455668 30.04.2014 08:31
quelle