2009-09-19 7 views
5

Se un server HTTP dovrebbe essere scritto in Python2.6 ha accesso locale a un file, quale sarebbe il modo più corretto per quel server di restituire il file a un client, su richiesta?Come inviare un file via HTTP, nel modo migliore, usando Python?

Diciamo che questa è la situazione attuale:

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() 

Tutti i file sono archivi .zip o .rar non più grandi di un paio di megabyte.

Con la situazione attuale, i browser gestiscono il download in arrivo in modo strano. Nessun browser conosce il nome del file, ad esempio, quindi ne usa uno casuale o predefinito. (Firefox ha persino salvato il file con un'estensione .part, anche se era completa e completamente utilizzabile.)

Quale sarebbe il modo migliore per correggere questo e altri errori di cui forse non sono nemmeno a conoscenza?

Quali intestazioni non sto inviando?

Grazie!

+3

"Nessun browser conosce il nome del file, ad esempio, quindi ne usa uno casuale o predefinito." L'intestazione Content-Disposition gestisce questo, no? - http://www.ietf.org/rfc/rfc2183.txt – rnicholson

risposta

6

Questo è come io mando file ZIP,

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

maggior parte dei browser di gestire correttamente.

1

Se non si dispone di restituire il corpo della risposta (vale a dire, se si è data un flusso per il corpo di risposta da parte vostra struttura) si può evitare di tenere il file in memoria con qualcosa di simile:

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

Quale framework Web stai utilizzando?

+0

Sto usando webpy. Dal momento che non sembra esporre un descrittore di file, la mia ipotesi è che potrei produrre lentamente il file? –

+1

Sembra essere esattamente ciò che raccomandano gli autori di web.py: http://webpy.org/cookbook/streaming_large_files – dcrosta

Problemi correlati