domingo, 23 de febrero de 2020

Cómo servir archivos o ficheros desde NodeJS y Express

El uso habitual de Express y NodeJS es la publicación de servicios que respondan con un conjunto de datos, habitualmente en formato JSON.

Pero, ¿cómo podemos responder con un fichero, como un PDF, una imagen o una hoja de cálculo?

La respuesta está en el siguiente código:

const express = require('express');
const path = require('path');
const fs  = require('fs');

const app = express();

app.get('/repository/:file'function (reqres) {
   const filePath = path.join(__dirname, `docs/${req.params.file}`);
   const stat = fs.statSync(filePath);

   res.writeHead(200, {
       'Content-Type''application/pdf',
       'Content-Length'stat.size
   });

   var readStream = fs.createReadStream(filePath);
   
   readStream.pipe(res);
});

app.listen(3000function () {
  console.log('Example app serving files on port 3000!');
});

El servicio atenderá a la siguiente URL:

http://:3000/repository/

La segunda línea, define la ruta de acceso al fichero. En este caso, la ruta será, partiendo de la ruta del código, añadirá la carpeta docs, en la cual se alojan los archivos.

/docs

La tercera línea obtendrá el número de bytes del fichero a enviar.

A continuación, se prepara la cabecera de la respuesta (mediante res.writeHead), indicando que el archivo a enviar será de tipo PDF (atributo Content-Type), junto con el número de bytes que se envía (atributo Content-Length).

Después, se crea un stream de lectura del fichero (mediante createReadStream), al que se le conecta un pipe a la respuesta. Esta operación lee el fichero y envía los datos a la respuesta. Resumiendo, el flujo de lectura del fichero estará conectado al flujo de escritura en la respuesta del servicio.

Enlaces de interés: