2012-10-09 42 views
7

En una cierta petición GET, necesito leer un archivo de forma local, en función de los parámetros de la solicitud, y enviarlo en flujo de entrada de la solicitud. ¿Cómo lo hago?Envío de un archivo binario en 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') 

Respuesta

9

Prueba esto (no para archivo grande):

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

Hay StaticFileHandler en tornado, ver tornado doc

+0

Gracias por su respuesta. Usted dice que esto no debe usarse para archivos grandes. ¿Alguna razón en particular para eso? – missingfaktor

+0

Los archivos con los que trataré tendrán como máximo 50 MB de tamaño. – missingfaktor

+0

@missingfaktor: Se lee el resto del documento a la vez, lo que aumentará considerablemente el uso de memoria. – nneonneo

11

He aquí una solución que funciona para archivos de tamaño arbitrario:

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, ¡gracias por su respuesta también! – missingfaktor

+1

+1 Es mejor. – iMom0