2012-10-09 15 views
7

In einer bestimmten GET Anfrage muss ich eine Datei lokal lesen, abhängig von den Parametern in der Anfrage, und senden Sie es auf Anfrage Eingangsstrom. Wie mache ich es?Senden einer Binärdatei in 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') 

Antwort

9

Versuchen Sie, diese (nicht für große Datei):

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

Es gibt StaticFileHandler in Tornado, siehe tornado doc

+0

Vielen Dank für Ihre Antwort. Sie sagen, dass dies nicht für große Dateien verwendet werden soll. Ein besonderer Grund dafür? – missingfaktor

+0

Die Dateien, mit denen ich zu tun haben werde, sind höchstens 50 MB groß. – missingfaktor

+0

@missingfaktor: Es liest die ganze Datei auf einmal, was die Speichernutzung erheblich erhöht. – nneonneo

11

Hier ist eine Lösung, die für beliebige große Dateien funktioniert:

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, danke auch für deine Antwort! – missingfaktor

+1

+1 Es ist besser. – iMom0