2009-09-19 7 views
5

Jeśli serwer, który ma być HTTP, napisany w Python2.6, ma lokalny dostęp do pliku, jaki byłby najbardziej prawidłowy sposób, aby serwer ten zwrócił plik klientowi na żądanie?Jak wysłać plik przez HTTP, dobry sposób, używając Pythona?

Powiedzmy to obecna sytuacja:

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

Wszystkie pliki .zip lub .rar są archiwa nie większy niż kilka megabajtów.

W obecnej sytuacji przeglądarki obsługują pobieranie przychodzące dziwnie. Żadna przeglądarka nie zna nazwy pliku, więc używają losowego lub domyślnego. (Firefox zapisał nawet plik z rozszerzeniem .part, mimo że był kompletny i całkowicie użyteczny).

Jaki byłby najlepszy sposób naprawienia tego i innych błędów, których może nawet nie jestem świadomy?

Jakie nagłówki nie wysyłam?

Dzięki!

+3

"Żadna przeglądarka nie zna nazwy pliku, na przykład, więc użyje losowego lub domyślnego." Nagłówek Content-Disposition to obsługuje, nie? - http://www.ietf.org/rfc/rfc2183.txt – rnicholson

Odpowiedz

6

ten sposób mogę wysłać plik ZIP,

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

Większość przeglądarek obsłużyć go prawidłowo.

1

Jeśli nie musiał wrócić organizm reakcji (to znaczy, jeśli są podane strumienia dla organizmu reakcji przez ram) można uniknąć trzyma plik w pamięci z czymś takim:

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

Jakie ramy internetowe wykorzystujesz?

+0

Używam webpy. Ponieważ wydaje się, że nie ujawnia on deskryptora pliku, zgaduję, że mogę powoli wydać plik? –

+1

Wygląda na to, co autorzy web.py polecają: http://webpy.org/cookbook/streaming_large_files – dcrosta

Powiązane problemy