Wie würden Sie eine Funktion zum Hochladen großer Dateien mit einer Django-Anwendung und S3 implementieren?
In meinem Nebenjob als Fotograf habe ich mehrere Kunden, für die ich Archivdateien mit mehreren Gigabyte (zip, tar) freigeben muss, die sowohl die Originale als auch die verarbeiteten Bilder des betreffenden Ereignisses enthalten. Bisher haben wir dafür Google Drive verwendet, bei dem ich die Datei auf GD hochgeladen und sie abgerufen und auf einem lokalen Speicherlaufwerk gespeichert habe. Ich habe den GD-Ordner gelegentlich bereinigt, da die dort hochgeladenen Dateien über den Mac Google Drive-Client auf meinem Computer gespiegelt werden. Da mein Mac nur über ein 256-GB-Onboard-Laufwerk verfügt, ist der Speicherplatz knapp.
Ein Kunde hatte in den letzten vier Monaten zwei Festplattenausfälle, bei denen es in den letzten zehn Jahren, in denen ich bei ihm beschäftigt war, keine gab. Sie wollen also eine bessere Lösung, und ich bin bereits Entwickler. Warum also nicht?
Die Frage ist nun, ob es eine gute Idee ist, den Browser für das Einreihen und Transportieren einer Archivdatei mit mehr als zwölf Gigabyte zu meinem Server verantwortlich zu machen, für die er einige Attributprüfungen durchläuft, bevor er zu S3 verschoben wird.
Ich kann zwei Optionen damit sehen:
- Verwenden Sie den Browser mit einem Datei-Upload-Formular, um eine mehrteilige Datei auf den Server hochzuladen. Nach Abschluss wird die Datei von einer lokalen Sellerie-Aufgabe überprüft und verarbeitet und dann in einen S3-Bucket hochgeladen.
- Implementieren Sie einen Django-Verwaltungsbefehl, um die Ausführung der lokalen Sellerie-Dateiverarbeitungsaufgabe auszulösen, und verwenden Sie ein lokales Python-Skript, das Paramiko verwendet , um die Datei hochzuladen und die Ausführung des Verwaltungsbefehls auszulösen, wenn der Upload abgeschlossen ist.
Persönlich neige ich zu Option 2, möchte aber wenn möglich andere Ideen.
quelle
Antworten:
Durch Gespräche mit anderen über dieses Thema habe ich eine Lösung zusammengestellt:
Um dies zu erreichen, muss Folgendes getan werden:
POST
an einen REST-API-Endpunkt gesendet werden kannquelle