2009-09-19 31 views
5

Si un posible servidor HTTP escrito en Python2.6 tiene acceso local a un archivo, ¿cuál sería la forma más correcta para que ese servidor devuelva el archivo a un cliente, a petición?¿Cómo enviar un archivo a través de HTTP, la mejor manera, usando Python?

Digamos que esta es la situación actual:

header('Content-Type', file.mimetype) 
header('Content-Length', file.size) # file size in bytes 
header('Content-MD5', file.hash) # an md5 hash of the entire file 

return open(file.path).read() 

Todos los archivos son archivos .zip o .rar no más grandes que un par de megabytes.

Con la situación actual, los navegadores manejan la descarga entrantemente extraña. Ningún navegador conoce el nombre del archivo, por ejemplo, así que usan uno aleatorio o predeterminado. (Firefox incluso guardó el archivo con la extensión .part, aunque fue completo y completamente utilizable).

¿Cuál sería la mejor manera de solucionar este y otros errores que aún no conozco?

¿Qué encabezados no estoy enviando?

Gracias!

+3

"Ningún navegador conoce el nombre del archivo, por ejemplo, así que usan uno aleatorio o predeterminado". El encabezado Content-Disposition maneja esto, ¿no? - http://www.ietf.org/rfc/rfc2183.txt – rnicholson

Respuesta

6

Ésta es la forma en que envío archivo ZIP,

req.send_response(200) 
    req.send_header('Content-Type', 'application/zip') 
    req.send_header('Content-Disposition', 'attachment;' 
        'filename=%s' % filename) 

La mayoría de los navegadores manejan correctamente.

1

Si usted no tiene que devolver el cuerpo de la respuesta (es decir, si se le da una corriente de los cuerpo de la respuesta de su marco) puede evitar que contenía el fichero en la memoria con algo como esto:

fp = file(path_to_the_file, 'rb') 
while True: 
    bytes = fp.read(8192) 
    if bytes: 
     response.write(bytes) 
    else: 
     return 

¿Qué entorno web estás utilizando?

+0

Estoy usando webpy. Dado que no parece exponer un descriptor de archivo, supongo que podría ceder el archivo lentamente. –

+1

Parece ser exactamente lo que recomiendan los autores de web.py: http://webpy.org/cookbook/streaming_large_files – dcrosta

Cuestiones relacionadas