2011-02-03 13 views
6

Sto tentando di creare una pagina di caricamento del file che richiederà all'utente un file e verrà caricato durante la visualizzazione del progresso.Come utilizzare Python/CGI per il caricamento di file

Al momento sono riuscito a creare una semplice pagina HTML che può chiamare il mio script python. Lo script python otterrà quindi il file e verrà caricato in blocchi di 1000 byte.

Ho due problemi principali (principalmente per essere totalmente nuovo a questo):

1) non riesco a ottenere la dimensione del file per il calcolo percentuale 2) Non so come comunicare tra il lato server python e tutto ciò che è nella pagina per aggiornare lo stato di avanzamento, presumibilmente javascript.

Sto andando tutto nel modo sbagliato? O c'è una soluzione ai miei problemi?

Ecco il mio codice python:

#!/usr/local/bin/python2.5 
import cgi, os 
import cgitb; cgitb.enable() 

try: 
    import msvcrt 
    msvcrt.setmode (0, os.O_BINARY) 
    msvcrt.setmode (1, os.O_BINARY) 

except ImportError: 
    pass 

form = cgi.FieldStorage() 
upload = form['file'] 

if upload.filename: 
    name = os.path.basename(upload.filename) 
    out = open('/home/oetzi/webapps/py/' + name, 'wb', 1000) 
    message = "The file '" + name + "' was uploaded successfully" 

    while True: 
     packet = upload.file.read(1000) 
     if not packet: 
      break 
     out.write(packet) 
    out.close() 
else: 

message = "Derp... could you try that again please?" 

print """\ 
Content-Type: text/html\n 
<html><body> 
<p>%s</p> 
</body></html> 
""" % (message,) 

risposta

6

Questo è più complessa di quanto non sembri, visto come il caricamento dei file funziona nel protocollo HTTP. La maggior parte dei server Web controllano lo script CGI solo quando il file caricato è stato completamente trasferito, quindi non c'è modo di fornire feedback nel frattempo.

Ci sono alcune librerie Python che tentano di affrontare questo problema, però. Ad esempio: gp.fileupload (funziona con WSGI, non con CGI).

Il trucco è quello di fornire un modo per interrogare l'avanzamento del caricamento tramite la tecnologia AJAX, mentre ancora il trasferimento del file caricato. Ciò è inutile se il server web (ad esempio, Apache o nginx) non è configurato per supportare la funzionalità di avanzamento del caricamento poiché probabilmente si noterà un salto dallo 0% al 100% nella barra di avanzamento.

vi consiglio di provare Plupload, che funziona secondo il lato client ed è molto più semplice.

Problemi correlati