Opzioni per gestire caricamenti di file di grandi dimensioni (multi-gigabyte)

8

Come implementeresti una funzionalità di upload di file molto grande con un'applicazione Django e S3?

Nel mio lavoro come fotografo, ho diversi clienti per i quali ho la necessità di condividere file di archivio multi-gigabyte (zip, tar) con quelli che contengono sia gli originali sia le immagini elaborate dell'evento in questione. Fino ad ora, stavamo usando Google Drive per questo, in cui avrei caricato il file su GD e avrebbero recuperato e salvato in un'unità di archiviazione locale. Ripulirei la cartella GD in alcuni casi, poiché i file caricati lì sono riflessi sul mio computer tramite il client Mac Google Drive. Dato che il mio Mac ha solo un'unità a bordo da 256 GB, lo spazio è prezioso.

Un cliente ha avuto due guasti del disco rigido negli ultimi quattro mesi, dove c'erano zero nei dieci anni precedenti che avevo impiegato da loro. Quindi vogliono una soluzione migliore e io sono già uno sviluppatore, quindi perché no?

Ora, la domanda è se sia una buona idea avere il browser responsabile per l'accodamento e il trasporto di un file di archivio di dodici gigabyte sul mio server, per il quale passerà attraverso la scansione di attributi prima di essere spostato lungo a S3.

Posso vedere due opzioni con questo:

  1. Utilizzare il browser con un modulo di caricamento file per caricare un file a più parti sul server. Al termine, il file verrà controllato ed elaborato da un'attività locale di Celery e quindi caricato su un bucket S3.
  2. Implementare un comando di gestione Django per attivare l'esecuzione dell'attività di Celery di elaborazione file locale e utilizzare uno script Python locale utilizzando Paramiko per caricare il file e attivare l'esecuzione del comando di gestione al termine del caricamento.

Personalmente, mi sto appoggiando all'Opzione 2, ma vorrei altre idee se possibile.

    
posta Jason 19.02.2017 - 16:14
fonte

1 risposta

2

Attraverso conversazioni con altri su questo argomento, penso di aver messo insieme una soluzione:

  1. Carica il file di archivio su S3
  2. L'azione di caricamento restituisce un ID S3, che può essere inviato a un endpoint API
  3. Il server recupera il file e passa all'attività di Celery per l'elaborazione.
  4. OPTIONAL : l'email viene inviata all'utente / gruppo per il quale

Per ottenere ciò, devi fare quanto segue:

  1. Scrivi uno script Python per utilizzare Caricamento multiparte di Boto3
  2. La chiamata al metodo Boto3 restituirà un riferimento all'oggetto, che può quindi essere POST ed a un endpoint dell'API REST
  3. Il server recupera il file quasi immediatamente tramite una connessione veloce in fibra e avvia un processo asincrono per elaborare il tempo.
risposta data 22.02.2017 - 12:19
fonte

Leggi altre domande sui tag