2012-10-09 29 views
7

Belirli bir GET isteğinde, istekte bulunan parametrelere bağlı olarak yerel olarak bir dosyayı okumalı ve isteğin giriş akışı üzerine göndermem gerekir. Nasıl yaparım?Tornado'da bir ikili dosya gönderme

class GetArchives(tornado.web.RequestHandler): 
    def get(self, param1, param2): 
     path = calculate_path(param1, param2) 
     try: 
      f = open(path, 'rb') 
      # TODO: send this file to request's input stream. 
     except IOError: 
      raise tornado.web.HTTPError(404, 'Invalid archive') 

cevap

9

(değil büyük dosya için) bu deneyin:

hortuma StaticFileHandler
try: 
    with open(path, 'rb') as f: 
     data = f.read() 
     self.write(data) 
    self.finish() 

yoktur, İşte keyfi boyutlu dosyalar için çalışan bir çözüm tornado doc

+0

Cevabınız için teşekkür ederiz. Bunun büyük dosyalar için kullanılmayacağını söylüyorsunuz. Bunun belli bir sebebi var mı? – missingfaktor

+0

Karşılaşacağım dosyalar en fazla 50 MB boyutunda olacak. – missingfaktor

+0

@missingfaktor: Tüm dosyayı bir kerede okur, bu da bellek kullanımını büyük ölçüde artıracaktır. – nneonneo

11

bkz:

with open(path, 'rb') as f: 
    while 1: 
     data = f.read(16384) # or some other nice-sized chunk 
     if not data: break 
     self.write(data) 
self.finish() 
+0

+1, cevabınız için teşekkürler! – missingfaktor

+1

+1 Daha iyi. – iMom0