2011-02-03 25 views
6

Estoy intentando crear una página de carga de archivos que solicitará al usuario un archivo y se cargará mientras se muestra el progreso.Cómo usar Python/CGI para cargar archivos

Por el momento he logrado hacer una simple página HTML que puede llamar a mi script python. El script de python obtendrá el archivo y lo cargará en fragmentos de 1000 bytes.

tengo dos problemas principales (principalmente debido a ser completamente nuevo en esto):

1) No puedo obtener el tamaño del archivo para calcular el porcentaje 2) No sé cómo comunicar entre el Python del lado del servidor y lo que esté en la página para actualizar el estado del progreso, presumiblemente javascript.

¿Estoy haciendo las cosas mal? ¿O hay una solución a mis problemas?

Aquí está mi código 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,) 

Respuesta

6

Esto es más complejo de lo que parece, dada la carga de archivos funciona en el protocolo HTTP. La mayoría de los servidores web darán control a la secuencia de comandos CGI solo cuando el archivo cargado se haya transferido por completo, por lo que no hay forma de dar retroalimentación mientras tanto.

Sin embargo, hay algunas bibliotecas de Python que intentan abordar este problema. Por ejemplo: gp.fileupload (funciona con WSGI, no CGI).

El truco consiste en proporcionar una forma de consultar el progreso de la carga a través de AJAX mientras se sigue transfiriendo el archivo cargado. Esto no sirve de nada si el servidor web (por ejemplo, Apache o nginx) no está configurado para admitir la función de progreso de carga porque probablemente verá un salto del 0% al 100% en la barra de progreso.

Sugiero que pruebe Plupload, que funciona en el lado del cliente y es mucho más simple.

Cuestiones relacionadas