Sto tentando di utilizzare il caricamento Ajax di Valum per caricare file su un sito basato su Django- che sto creando. Attualmente sto evitando un modulo semplicemente perché AU invia il caricamento come la totalità dei dati POST in una richiesta ajax . In questo momento ho un approccio molto ingenuo a fare questo:Caricamento di Ajango Ajax al di fuori di un modulo
upload = SimpleUploadedFile(filename, request.raw_post_data)
...then I loop through the chunks to write to disk...
Questo funziona benissimo ... su file di piccole dimensioni. Ho provato con PDF, vari altri file e fino al pacchetto deb di Google Chrome da ~ 20MB e sono tutti in grado di fare ottimi risultati con lo . Tuttavia, se mi sposto in qualcosa come un CD o un DVD iso bombarda in modo orribile. Spesso Django invia una risposta di memoria esaurita . In superficie questo ha senso poiché SimpleUploadedFile è una versione in-memory delle classi di upload. Non riesco a vedere come utilizzare TemporaryUploadedFile perché non accetta il contenuto effettivo nel suo costruttore . Come nota a margine: penserei che dopo aver usato la RAM disponibile su sarebbe andata alla memoria virtuale, ma qualunque cosa.
Quindi, la mia domanda è: come faccio a farlo funzionare? C'è un modo migliore per leggere nel file? Ho provato a leggere direttamente il raw_post_data tramite IO di Python (il sistema utilizza 2.6.5) ma il codificatore/decodificatore ASCII di FileIO si lamenterà ovviamente dei caratteri non ascii quando si lavora con i file binari . Non sono stato in grado di trovare informazioni sulla modifica dell'encoder/decoder .
Non mi dispiacerebbe passare i dati in una forma e con Django fare il lavoro di scegliere la classe di upload a destra e così via, ma non riesco a capire fuori come passare, perché qualcosa di simile
upload_form = UploadForm(request.POST, request.FILES)
non funziona perché il POST contiene il file e non le normali informazioni su Django e FILES non esistono.
Come ho detto, non sono preoccupato per il metodo della soluzione, solo che ottengo qualcosa che funzioni! Grazie!
Ho scritto un post sul blog che mostra l'immagine completa su come caricare Ajax su Django 1.3, che include la soluzione di cui sopra. http://kuhlit.blogspot.com/2010/12/ajax-uploads-in-django-with-little-help.html –
Grazie per questo @ alex-kuhl C'è un modo per munge il supporto di tipo file nel ultima versione di Django (1.2.5)? Temo di colpire l'aggiornamento dell'inferno della dipendenza. – michela
Non ho avuto problemi con l'aggiornamento a 1.3, quindi potrebbe non essere così male come pensi. In realtà non ho mai provato a ottenere il supporto di tipo file in 1.2.5, quindi non sono sicuro che sia possibile farlo, sospetto non facilmente. Quello che ho fatto nel primo frammento sopra è stato provare ad usare le normali funzionalità di Python ed evitare Django. Ha funzionato, come ho notato, ma non è riuscito per i file di una certa dimensione. Se non si accettano i file di grandi dimensioni, è possibile utilizzare il codice così com'è, altrimenti sono sicuro che esiste un modo per risolvere il problema in tutti i casi. Potrebbe essere semplice come fare la lettura/scrittura di file usando classi diverse. –