2011-11-23 26 views
17

Mi chiedo se ci sono delle ramificazioni nel caricamento di file di circa 4 GB attraverso un'applicazione web che utilizza Django/Python? Ricordo che in passato il caricamento in streaming con Java era il metodo preferito ma lo fa ancora oggi o è perfettamente sicuro farlo con Django/Python?Caricamento di file di grandi dimensioni con Python/Django

+0

"perfettamente sicuro"? È sempre stato perfettamente al sicuro. Cosa potrebbe essere "pericoloso" a riguardo? Di cosa sei preoccupato? Quali problemi vorresti evitare? –

+4

Java o simile (come plug-in del browser - quella parte è la chiave) è stato utilizzato per questo tipo di cose in passato perché può quindi tenere conto dell'avvio, degli arresti e dei ripristini dei trasferimenti. Il caricamento di 4 GB su HTTP è folle (semplicemente utilizzando un campo di caricamento file standard). Periodo. –

+3

Chris, perché è folle? Puoi dare maggiori dettagli? Puoi suggerire un'alternativa dato che il file caricato è relativo all'app Web e all'account utente, quindi FTP non è una soluzione. – JeffC

risposta

19

Django per impostazione predefinita metterà in memoria i dati del file caricato se è inferiore a 2,5 MB. Tutto ciò che è più grande verrà scritto nella directory /tmp del server e quindi copiato al termine del trasferimento. Molte delle impostazioni di caricamento dei file di Django possono essere personalizzate, i dettagli sono disponibili in . Puoi anche personalizzare la gestione dei file e sicuramente vorrai farlo.

Prima di considerare eventuali limitazioni tecniche, il caricamento di file di grandi dimensioni con il browser darà all'utente un'esperienza molto scarsa. Non ci sono feedback su come il trasferimento sta andando (anche se google chrome mostra lo stato del caricamento in percentuale) e non c'è modo di mettere in pausa o riprendere i trasferimenti.

È inoltre possibile che si verifichino problemi sul server. A parte il tempo estremamente lungo in cui ogni thread verrà utilizzato per gestire i dati in streaming, si avrà il tempo necessario affinché il sistema copi il file risultante da /tmp nella posizione corretta.

A meno che non si sia certi che si possa prevedere qualsiasi problema che il server possa avere con i caricamenti, suggerirei che questa sia una cattiva idea. È piuttosto difficile trovare informazioni su questo tramite google e sembra che ci siano molti accessi che descrivono problemi con upload di file di grandi dimensioni.

Mentre Django è tecnicamente in grado di ricevere file caricati così grandi, l'esperienza utente e le difficoltà tecniche molto povere significano che questo potrebbe non essere l'approccio migliore. Hai pensato di utilizzare un software dedicato per gestire il trasferimento dei file?

+3

ciao adamnfish, grazie per la risposta approfondita. Ho preso in considerazione un servizio separato, il mio unico problema è che questa è un'app web specifica per gruppi specifici, caricheranno tutti i film che hanno creato, che possono essere di circa 4 GB, quindi imposto un limite a 4 GB. L'idea è che saranno in grado di caricare questi file e sarà legato al loro account. Possono avere più file nel loro account. Sono a conoscenza dell'esperienza dell'utente e sono anche loro e stanno bene, ho solo bisogno di capire il modo migliore per farlo, quindi non ci sono problemi con il server – JeffC

+1

Usa ['django-chunked-uploads'] (https : //github.com/juliomalegria/django-chunked-upload)!(disclaimer: ho scritto quella libreria). – juliomalegria

5

L'ultima risposta lo copre. Noi abitualmente carichiamo 2.5MB + (ma di solito non 4gb)

collegamento adamnish è corretta, vedere questo frammento (dal suo link to django docs) per quanto riguarda la scrittura del file su disco, invece di avere nella memoria prima:

def handle_uploaded_file(f): 
    with open('some/file/name.txt', 'wb+') as destination: 
     for chunk in f.chunks(): 
      destination.write(chunk) 

maggiori informazioni sui "blocchi" chiamare: https://docs.djangoproject.com/en/dev/ref/files/uploads/#django.core.files.uploadedfile.UploadedFile.chunks

pagina comprende come impostare il formato "chunk", ecc

Problemi correlati