2009-09-19 37 views
5

Python2.6'da yazılmış bir HTTP-sunucusunun bir dosyaya yerel erişimi varsa, bu sunucu için istemciye bir istekte bulunacak en doğru yol ne olurdu? Python kullanarak, HTTP üzerinden bir dosya nasıl gönderilir?

en bu mevcut durum diyelim:

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

Tüm dosyalar megabayt bir çift daha büyük .zip ya .rar arşivleri vardır.

Mevcut durumla, tarayıcılar gelen yüklemeyi tuhaf bir şekilde ele alır. Hiçbir tarayıcı dosya adını bilmez, örneğin rasgele veya varsayılan bir tane kullanır. (Firefox, dosyayı tamamen ve tamamen kullanılabilir olsa bile bir .part uzantısı ile kaydetmiştir.)

Henüz bilmediğim bu ve diğer hataları düzeltmenin en iyi yolu ne olurdu?

Hangi üstbilgileri yollamıyorum?

Teşekkürler!

+3

"Tarayıcıda dosya adı bilinmiyor, örneğin rasgele veya varsayılan bir tane kullanıyorlar." Content-Disposition üstbilgi, bunu işler, değil mi? - http://www.ietf.org/rfc/rfc2183.txt – rnicholson

cevap

6

,

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

Çoğu tarayıcı düzgün bir şekilde işler.

1

z (yani çerçeve ile cevap gövdesi bir dere verilirse yani,) böyle bir şey ile hafızada dosyayı tutan önleyebilirsiniz tepki vücudu dönmek zorunda yoksa:

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

Hangi web çerçevesini kullanıyorsunuz? Ben ZIP dosyasını göndermek nasıl budur

+0

Webpy kullanıyorum. Bir dosya tanıtıcısı göstermediği için, tahminim yavaşça dosyayı verebilir miyim? –

+1

Web.py yazarlarının tam olarak önerdiği gibi görünüyor: http://webpy.org/cookbook/streaming_large_files – dcrosta

İlgili konular