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!
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 objetoFormData
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 objetoFormData
utilizando el métodoappend
. El métodoappend
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. Lasheaders
de esta solicitud deben incluir la cabeceraContent-Type
con un valor de límite generado por el objetoFormData
. Elbody
de la solicitud debe ser el buffer del objetoFormData
.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étodopipe
para conectar las dos solicitudes en un flujo de datos. El métodopipe
transfiere datos desde un flujo de lectura a un flujo de escritura. En este caso, pasarías la respuesta de la solicitud de laurl
al objetoFormData
a través depipe
, y luego pasarías el objetoFormData
a la solicitud de la API externa.Aquí tienes un ejemplo de implementación:
En esta implementación, la función
uploadFile
devuelve unaPromise
que se resuelve cuando la carga está completa o se rechaza si hay un error. La función toma cuatro argumentos:newFileName
,mimeType
,url
yattachmentUrl
.El objeto
form-data
se crea al principio de la función. Luego, se utiliza el módulohttp
para solicitar el flujo de datos de laurl
.Una vez que se recibe el flujo de datos, se agrega al objeto
form-data
utilizando el métodoappend
, como se describe anteriormente.Luego se crea una nueva solicitud
http
para subir el objetoform-data
al endpoint de carga de archivos de la API externa. El objetoform
se pasa a la solicitud utilizando el métodopipe
.Si hay un error en alguna de las solicitudes, la
Promise
se rechaza con el error. De lo contrario, laPromise
se resuelve cuando la carga está completa.