es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Fastify – Enviando un PDF desde el servidor de node.js

Tengo una API construida en node.js con Fastify.

El servidor genera un PDF que luego intento enviar a un cliente a través de una solicitud de API. Sin embargo, la solicitud que veo en Chrome en la sección de la red muestra el tipo como “XHR”, a pesar de que he configurado el tipo de contenido de la siguiente manera:

const fs = require('fs');
const stream = fs.createReadStream('../test.pdf', 'binary');
reply.header('Content-Type', 'application/pdf');
reply.send(stream).type('application/pdf').code(200);

En el lado del cliente, simplemente estoy haciendo una solicitud POST simple y asumiendo que si es un PDF, el navegador lo descargará automáticamente.

axios.post('http://127.0.0.1:8080/contract', requestBody)
.then((response) => {
   setIsSubmitting(false);
})
.catch((error) => {
   //TODO
});

(También, la otra idea que tuve fue si esta es realmente la forma correcta de enviar, es decir, con fs.createReadStream – es solo un archivo estático).

¿Alguna idea de qué estoy haciendo mal en lo anterior?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Un posible problema con el código anterior podría ser que los encabezados de respuesta no están explícitamente establecidos para permitir la descarga de archivos, lo que podría estar causando que se realice una solicitud XHR en lugar de desencadenar una descarga en el navegador. Para establecer los encabezados correctamente, el encabezado Content-Disposition debe establecerse con un valor de attachment, lo que indica al navegador que la respuesta es un archivo adjunto y debe ser descargado en lugar de mostrarse en la ventana del navegador.

    Aquí hay un ejemplo de cómo establecer los encabezados con Fastify:

    const fs = require('fs')
    const stream = fs.createReadStream('../test.pdf', 'binary')
    const filename = 'test.pdf'
    
    reply.header('Content-Type', 'application/pdf')
    reply.header('Content-Disposition', `attachment; filename="${filename}"`)
    reply.send(stream)
    

    Además de establecer los encabezados, el método fs.createReadStream() se puede utilizar para transmitir los datos del archivo a la respuesta, lo que es una forma más eficiente de manejar archivos grandes que cargar todo el archivo en memoria primero.

    Con estos cambios, el navegador debería solicitar al usuario que descargue el archivo PDF cuando se realice la solicitud de la API.

Comments are closed.