2012-10-09 77 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

相关问题