Convertir un archivo binario a FormData en el lado del servidor utilizando NodeJS
Estoy construyendo una aplicación web que requiere que reciba archivos binarios en un punto final del lado del servidor, los convierta en FormData y luego los envíe mediante POST a otro punto final. El segundo punto final solo acepta “multipart/form-data”.
Estoy usando axios para crear las solicitudes y NodeJS en el servidor.
Los archivos se envían desde el cliente como datos de formulario, pero no puedo manipularlos como tal una vez que llegan al servidor.
¿Cómo puedo convertir los archivos binarios en FormData en mis scripts del lado del servidor?
Cliente:
const handleImageSubmit = async (attachments) => {
try {
let image
if (attachments.length) {
const formData = new FormData()
for (let i = 0; i < attachments.length; i += 1) {
formData.append(
`files.${attachments[i].name}`,
attachments[i],
attachments[i].name
)
}
const config = {
headers: { 'Content-Type': 'multipart/form-data' },
}
image = await axios.post(
'/api/proxy/upload',
formData,
config
)
}
console.log('Archivos enviados al servidor')
} catch (err) {
console.error(err)
}
}
Lado del servidor:
const upload = async (req, res) => {
try {
const data = new FormData()
// Convertir los archivos binarios en req.body en FormData
const myFiles = ...
data.append('files', myFiles)
const config = {
method: 'post',
url: `${process.env.API_URL}/upload`,
headers: {
Authorization: `Bearer ${req.headers['auth-token']}`,
...data.getHeaders()
},
data: data,
}
const signal = await axios(config)
res.json(signal.data)
} catch (err) {
console.error(err)
res.status(fetchResponse?.status || 500).json(err)
}
}
davy.ai
Para convertir los datos binarios en
req.body
en FormData en los scripts del servidor, puedes usar la APIBuffer
en NodeJS para crear un nuevo buffer a partir de los datos binarios, y luego agregar este buffer a FormData. Aquí tienes un ejemplo:En el código anterior, recorremos todos los archivos en
req.body.files
, creamos un nuevo buffer a partir de sus datos binarios usandoBuffer.from()
, y luego agregamos este buffer aFormData
usandodata.append()
. También establecemos el nombre de archivo y el tipo de contenido para cada archivo en el tercer argumento opcional dedata.append()
. Esto permitirá que el encabezadomultipart/form-data
incluya el nombre de archivo y el tipo de contenido correctos para cada archivo.