2015-05-13 10 views
8

Próbuję zwrócić niektóre dane binarne za pomocą Express. W tym przykładzie jest to plik PDF, ale teoretycznie może to być dowolny plik.Express - Zwróć dane binarne z odległego serwisu internetowego

Ale skup się na pdf w tej chwili. Napisałem ten kod:

app.get('*', function (req, res) { 
    getBinaryData(req.url, 
     function (answer) { 
      res.type('pdf'); 
      res.end(new Buffer(answer, 'binary')); 
     }, 
     function (error) { 
      res.setHeader('Content-Type', 'text/plain'); 
      return res.end(error); 
     } 
    ); 
}); 

Na podstawie tego, co widziałem tutaj: https://github.com/strongloop/express/issues/1555

Ale ja pobrać plik PDF z prawej liczby stron, prawej tytule .... ale wszystkie strony są puste

Jestem pewien, że dotyczą zwrotu getBinaryData(), ponieważ ta funkcja zażądała zewnętrznej usługi sieci Web, a kiedy zapytałem bezpośrednio tę usługę, otrzymałem odpowiedni dokument.

Z góry dziękuję za odpowiedzi

+0

Dlaczego nie stosować metody 'res.sendFile'? – vanadium23

+0

ponieważ nie mam pliku: otrzymuję tę zawartość binarną z innej usługi WebService. W końcu mogę utworzyć plik tymczasowy i użyć sendFile ... – Varkal

Odpowiedz

15

Znalazłam bardziej proste rozwiązanie:

request(req.url).pipe(res); 

rury Ten oryginalny odpowiedzi z odległego Web Service bezpośrednio do mojej odpowiedzi! Mam poprawny plik niezależnie od typu pliku.

+0

Próbowałem tego samego, ale to nie działa dla mnie. http://stackoverflow.com/questions/37517312/issue-while-requesting-a-fileimage-pdf-excel-sheet-from-server-and-then-pipe-t –

+0

@Varkal Dzięki człowiek działa dobrze :) –

17

Oto moja nieco oczyszczona wersja tego, jak zwracać pliki binarne za pomocą Express. Zakładam, że dane znajdują się w obiekcie, który można zadeklarować jako binarny i ma długość:

exports.download = function (data, filename, mimetype, res) { 
    res.writeHead(200, { 
     'Content-Type': mimetype, 
     'Content-disposition': 'attachment;filename=' + filename, 
     'Content-Length': data.length 
    }); 
    res.end(new Buffer(data, 'binary')); 
}; 
+0

Nieznaczne literówka. Powinno to być: 'res.end (nowy bufor (dane), 'binarny')' –

+0

należy pamiętać, że nowy bufor() jest przestarzały i ma problemy z bezpieczeństwem. –