2012-10-09 24 views
7

特定のGETリクエストでは、リクエストのパラメータに応じてローカルでファイルを読み込み、リクエストの入力ストリームに送信する必要があります。どうすればいいのですか?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') 

答えて

9

(ない大きなファイルに対して)これを試してみてください:

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

竜巻でStaticFileHandlerがあり、tornado doc

+0

ありがとうございます。これは、大きなファイルには使用されないと言います。それに対する特別な理由は何ですか? – missingfaktor

+0

私が扱うファイルのサイズは最大50 MBです。 – missingfaktor

+0

@missingfaktor:ファイル全体を一度に読み込むので、メモリ使用量が大幅に増加します。 – nneonneo

11

を参照してくださいここでは、任意のサイズのファイルのために機能するソリューションです:

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、あなたの答えもありがとう! – missingfaktor

+1

+1いいですね。 – iMom0

関連する問題