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.

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)
    }
}
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para convertir los datos binarios en req.body en FormData en los scripts del servidor, puedes usar la API Buffer en NodeJS para crear un nuevo buffer a partir de los datos binarios, y luego agregar este buffer a FormData. Aquí tienes un ejemplo:

    const upload = async (req, res) => {
      try {
        const data = new FormData()
    
        // Convertir los datos binarios en req.body en FormData
        for (const file of Object.values(req.body.files)) {
          const buffer = Buffer.from(file.data, 'binary')
          data.append('files', buffer, {
            filename: file.name,
            contentType: file.type,
          })
        }
    
        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)
      }
    }
    

    En el código anterior, recorremos todos los archivos en req.body.files, creamos un nuevo buffer a partir de sus datos binarios usando Buffer.from(), y luego agregamos este buffer a FormData usando data.append(). También establecemos el nombre de archivo y el tipo de contenido para cada archivo en el tercer argumento opcional de data.append(). Esto permitirá que el encabezado multipart/form-data incluya el nombre de archivo y el tipo de contenido correctos para cada archivo.

Comments are closed.