2012-10-09 46 views
7

Trong một yêu cầu GET nhất định, tôi cần đọc tệp cục bộ, tùy thuộc vào thông số trong yêu cầu và gửi tệp đó trên luồng đầu vào của yêu cầu. Tôi phải làm nó như thế nào?Gửi tệp nhị phân trong 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') 

Trả lời

9

Hãy thử điều này (không phải cho tập tin lớn):

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

StaticFileHandler trong cơn lốc xoáy, xem tornado doc

+0

Cảm ơn câu trả lời của bạn. Bạn nói điều này không được sử dụng cho các tệp lớn. Bất kỳ lý do cụ thể cho điều đó? – missingfaktor

+0

Các tệp tôi sẽ xử lý sẽ có kích thước tối đa là 50 MB. – missingfaktor

+0

@missingfaktor: Nó đọc toàn bộ tệp trong cùng một lúc, điều này sẽ làm tăng đáng kể mức sử dụng bộ nhớ. – nneonneo

11

Dưới đây là một giải pháp mà làm việc cho tùy ý kích thước tập tin:

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, cảm ơn câu trả lời của bạn! – missingfaktor

+1

+1 Tốt hơn. – iMom0

Các vấn đề liên quan