Optionen für große (Multi-Gigabyte) Datei-Uploads

8

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:

  1. 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.
  2. 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.

Jason
quelle
3
Ich bin mit den Details von Django und Sellerie nicht vertraut, aber für welche Lösung Sie sich auch entscheiden, Sie sollten sie wahrscheinlich so robust machen, dass Sie einen teilweise erfolgreichen Upload zu einem späteren Zeitpunkt nach einer Unterbrechung fortsetzen können. Die Verwendung mehrteiliger Archive sowie Prüfsummen für jedes Teil ist hierfür möglicherweise eine gute Idee.
Doc Brown
Ich würde jedoch versuchen, der Versuchung zu widerstehen, rsync neu zu erfinden . Scheint, als wäre es das Werkzeug für Ihren Job.
5gon12eder

Antworten:

1

Durch Gespräche mit anderen über dieses Thema habe ich eine Lösung zusammengestellt:

  1. Laden Sie die Archivdatei in S3 hoch
  2. Die Upload-Aktion gibt eine S3-ID zurück, die an einen API-Endpunkt gesendet werden kann
  3. Der Server ruft die Datei ab und übergibt sie zur Verarbeitung an die Sellerie-Aufgabe.
  4. OPTIONAL : E-Mail wird an Benutzer / Gruppe gesendet, für die die

Um dies zu erreichen, muss Folgendes getan werden:

  1. Schreiben Sie ein Python-Skript, um Boto3s Multipart Upload zu verwenden
  2. Der Boto3-Methodenaufruf gibt einen Verweis auf das Objekt zurück, der dann POSTan einen REST-API-Endpunkt gesendet werden kann
  3. Der Server ruft die Datei fast sofort über eine schnelle Glasfaserverbindung ab und startet einen asynchronen Job, um die Zeit zu verarbeiten.
Jason
quelle