2015-05-13 2 views
8

Я пытаюсь вернуть некоторые двоичные данные с помощью Express. В этом примере это PDF, но теоретически это может быть любой файл.Express - возвращает двоичные данные из удаленного webservice

Но сосредоточьтесь на pdf на данный момент. Я написал этот код:

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); 
     } 
    ); 
}); 

Основываясь на том, что я видел здесь: https://github.com/strongloop/express/issues/1555

Но я получаю PDF-файл с нужным количеством страниц, правый титул .... но все страницы пустые

Я уверен в возврате getBinaryData(), потому что эта функция запрашивала внешний веб-сервис, и когда я прямо спросил эту службу, я получил правильный документ.

Заранее спасибо за ответы

+0

Почему бы не использовать метод 'res.sendFile'? – vanadium23

+0

причина У меня нет файла: я получаю этот двоичный контент из другого WebService. В конце концов, я могу создать временный файл и использовать sendFile ... – Varkal

ответ

15

Я нашел более простое решение:

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

Это трубы оригинальный ответ от отдаленного веб-службы непосредственно на мой ответ! Я получил правильный файл независимо от типа файла.

+0

Я пробовал то же самое, но он не работает для меня. http://stackoverflow.com/questions/37517312/issue-while-requesting-a-fileimage-pdf-excel-sheet-from-server-and-then-pipe-t –

+0

@Varkal Спасибо, человек отлично работает :) –

17

Вот моя слегка очищенная версия о том, как вернуть двоичные файлы с помощью Express. Я полагаю, что данные находятся в объекте, который может быть объявлен как двоичный и имеет длину:

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

Slight опечатка. Это должно быть: 'res.end (новый буфер (data), 'binary')' –

+0

Имейте в виду, что новый Buffer() устарел и имеет проблемы с безопасностью. –

Смежные вопросы