2012-10-09 19 views
7

W pewnym żądaniu GET, muszę odczytać plik lokalnie, w zależności od parametrów w żądaniu, i wysłać go na strumień wejściowy żądania. Jak mam to zrobić?Wysyłanie pliku binarnego w Tornado

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

Odpowiedz

9

Spróbuj tego (nie za duży plik):

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

Jest StaticFileHandler w tornado, zobacz tornado doc

+0

Dziękuję za odpowiedź. Mówisz, że to nie ma być używane do dużych plików. Jakiś szczególny powód? – missingfaktor

+0

Pliki, z którymi będę mieć do czynienia, będą miały maksymalnie 50 MB. – missingfaktor

+0

@missingfaktor: odczytuje cały plik naraz, co znacznie zwiększy użycie pamięci. – nneonneo

11

Oto rozwiązanie, które działa dla dowolnych rozmiarów plików:

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, dziękuję za odpowiedź! – missingfaktor

+1

+1 To jest lepsze. – iMom0