web-dev-qa-db-fra.com

Express - Renvoyer des données binaires d'un service Web distant

J'essaie de renvoyer des données binaires avec Express. Dans l'exemple, c'est un PDF mais théoriquement, cela peut être n'importe quelle sorte de fichier.

Mais concentrez-vous sur le pdf pour le moment. J'ai écrit ce code:

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

Basé sur ce que j'ai vu ici: https://github.com/strongloop/express/issues/1555

Mais, j'obtiens un fichier pdf avec le bon nombre de pages, le bon titre .... mais toutes les pages sont vierges

Je suis sûr qu'il s'agit du retour de getBinaryData (), car cette fonction a demandé un service Web externe et quand j'ai demandé directement ce service, j'ai obtenu le bon document.

Merci d'avance pour vos réponses

11
Varkal

J'ai trouvé une solution plus simple:

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

Cela redirige la réponse d'origine d'un service Web distant directement vers ma réponse! J'ai obtenu le bon fichier quel que soit le type de fichier.

21
Varkal

Voici ma version légèrement nettoyée de la façon de retourner des fichiers binaires avec Express. Je suppose que les données sont dans un objet qui peut être déclaré binaire et a une longueur:

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