2012-10-09 13 views
7

In una determinata richiesta GET, ho bisogno di leggere un file localmente, in base ai parametri nella richiesta, e inviarlo sul flusso di input della richiesta. Come lo faccio?Invio di un file binario 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') 

risposta

9

Prova questo (non per file di grandi dimensioni):

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

C'è StaticFileHandler nel tornado, vedere tornado doc

+0

Grazie per la risposta. Tu dici che questo non deve essere usato per i file di grandi dimensioni. Qualche ragione particolare per quello? – missingfaktor

+0

I file con cui ho a che fare saranno al massimo di 50 MB. – missingfaktor

+0

@missingfaktor: legge l'intero file in una sola volta, il che aumenterà notevolmente l'utilizzo della memoria. – nneonneo

11

Ecco una soluzione che funziona per i file arbitrari dimensioni:

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, grazie anche per la tua risposta! – missingfaktor

+1

+1 È meglio. – iMom0