2009-09-19 5 views
5

Si un serveur HTTP écrit en Python2.6 a un accès local à un fichier, quelle serait la meilleure façon pour ce serveur de renvoyer le fichier à un client, sur demande?Comment envoyer un fichier via HTTP, la bonne façon, en utilisant Python?

Disons que c'est la situation actuelle:

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

Tous les fichiers sont des archives .zip ou .rar pas plus gros que quelques méga-octets.

Dans la situation actuelle, les navigateurs gèrent bizarrement le téléchargement entrant. Aucun navigateur ne connaît le nom du fichier, par exemple, ils utilisent donc un nom aléatoire ou par défaut. (Firefox a même enregistré le fichier avec une extension .part, même si elle était complète et complètement utilisable.)

Quel serait le meilleur moyen de résoudre ce problème et d'autres erreurs dont je ne suis peut-être même pas conscient, pour le moment?

Quels sont les en-têtes que je n'envoie pas?

Merci!

+3

"Aucun navigateur ne connaît le nom du fichier, par exemple, ils utilisent donc un nom aléatoire ou par défaut." L'en-tête Content-Disposition gère cela, non? - http://www.ietf.org/rfc/rfc2183.txt – rnicholson

Répondre

6

Voici comment j'envoyer fichier ZIP,

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

La plupart des navigateurs gèrent correctement.

1

Si vous ne devez retourner le corps de la réponse (qui est, si on vous donne un cours d'eau pour le corps de la réponse par votre cadre), vous pouvez éviter de tenir le fichier en mémoire avec quelque chose comme ceci:

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

Quelle infrastructure Web utilisez-vous?

+0

J'utilise webpy. Comme il ne semble pas exposer un descripteur de fichier, je suppose que je pourrais céder lentement le fichier? –

+1

Semble être exactement ce que les auteurs web.py recommandent: http://webpy.org/cookbook/streaming_large_files – dcrosta

Questions connexes