web-dev-qa-db-ja.com

Express-離れたWebサービスからバイナリデータを返す

Expressでバイナリデータを返そうとしています。例では、PDFですが、理論的には、これは任意の種類のファイルです。

ただし、当面は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ファイルを取得します...しかし、すべてのページが空白です

この関数は外部Webサービスを要求し、このサービスを直接要求したときに適切なドキュメントを取得したため、getBinaryData()が返されることを心配しています。

回答ありがとうございます

11
Varkal

私はより簡単な解決策を見つけました:

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

これにより、離れたWebサービスからの元の応答が直接私の応答にパイプされます!ファイルの種類に関係なく、正しいファイルを取得しました。

21
Varkal

これは、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(Buffer.from(data, 'binary'));
};
29
Michael Shopsin