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.

Obtener un archivo desde una URL y enviarlo a un punto de conexión de API de carga de archivos externo como datos de formulario multipartes en NodeJS.

Me gustaría implementar un punto de conexión que tenga 3 entradas: newFileName, mimeType y url. Este punto de conexión debe solicitar desde la “url” y sin llenar la memoria, debe transmitir los datos al punto de carga de archivo de una API externa. La API externa acepta formdata.

He intentado enviar la transmisión como FormData pero no logré conectar (¿pipe?) las partes.

const FormData = require('form-data');
const http = require('http');
//...
    const form = new FormData();
    http.request(url, (response) => {
        form.append('attachment', response, {
            filename: newFileName,
            contentType: mimeType
        });
    });
    http.request({
        method: 'POST',
        url: attachmentUrl.href,
        ignoreError: true,
        rejectUnauthorized: false,
        headers: form.getHeaders(),
        body: form.getBuffer()
    });

¿Podría alguien ayudarme a conectar las dos solicitudes en una transmisión de datos donde la memoria solo almacena los fragmentos y no todo, mientras la API externa recibe formdata multipartes?

¡Gracias por su tiempo y respuestas!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para implementar un endpoint que transmita datos al endpoint de carga de archivos de una API externa, puedes utilizar el módulo form-data para crear un objeto FormData nuevo y agregar los datos a él.

    Primero, debes hacer una solicitud a la url para obtener el flujo de datos. Luego, puedes agregar el flujo al objeto FormData utilizando el método append. El método append toma tres argumentos: el nombre del campo, el flujo de lectura y un objeto de opciones que incluye el nombre del archivo y el tipo de contenido.

    Una vez que el objeto FormData está lleno con los datos, puedes hacer una segunda solicitud al endpoint de carga de archivos de la API externa. Las headers de esta solicitud deben incluir la cabecera Content-Type con un valor de límite generado por el objeto FormData. El body de la solicitud debe ser el buffer del objeto FormData.

    Para lograr el objetivo de transmitir los datos desde la url al endpoint de carga de archivos de la API externa sin llenar la memoria, puedes utilizar el método pipe para conectar las dos solicitudes en un flujo de datos. El método pipe transfiere datos desde un flujo de lectura a un flujo de escritura. En este caso, pasarías la respuesta de la solicitud de la url al objeto FormData a través de pipe, y luego pasarías el objeto FormData a la solicitud de la API externa.

    Aquí tienes un ejemplo de implementación:

    const FormData = require('form-data');
    const http = require('http');
    
    function uploadFile(newFileName, mimeType, url, attachmentUrl) {
      return new Promise((resolve, reject) => {
        const form = new FormData();
    
        http.request(url, (response) => {
          form.append('attachment', response, {
            filename: newFileName,
            contentType: mimeType
          });
    
          const request = http.request({
            method: 'POST',
            url: attachmentUrl.href,
            ignoreError: true,
            rejectUnauthorized: false,
            headers: form.getHeaders()
          }, (response) => {
            // handle response
          });
    
          form.pipe(request);
        }).on('error', reject);
      });
    }
    

    En esta implementación, la función uploadFile devuelve una Promise que se resuelve cuando la carga está completa o se rechaza si hay un error. La función toma cuatro argumentos: newFileName, mimeType, url y attachmentUrl.

    El objeto form-data se crea al principio de la función. Luego, se utiliza el módulo http para solicitar el flujo de datos de la url.

    Una vez que se recibe el flujo de datos, se agrega al objeto form-data utilizando el método append, como se describe anteriormente.

    Luego se crea una nueva solicitud http para subir el objeto form-data al endpoint de carga de archivos de la API externa. El objeto form se pasa a la solicitud utilizando el método pipe.

    Si hay un error en alguna de las solicitudes, la Promise se rechaza con el error. De lo contrario, la Promise se resuelve cuando la carga está completa.

Comments are closed.