如何下载远程图像然后将图像作为图像文件上传以提交表单?

Cra*_*lot 1 javascript form-data node.js node-modules axios

还有类似的问题像这个这个这个这个,但没有帮助。

在 Node 中,目标是使用 axios 模块从 Twitter 下载图像,然后将此图像作为图像文件作为表单提交的一部分上传。

此代码下载 Twitter 图像,但上传的二进制图像在到达服务器(也是我们的服务器)时已损坏。

图像必须以二进制形式上传。

表单是必需的,因为其他字段也与二进制图像一起提交。删除了这些其他表单字段以简化代码示例。

        const axios = require('axios');
        const FormData = require('form-data');

        let response = await axios.get('https://pbs.twimg.com/media/EyGoZkzVoAEpgp9.png', {
                                responseType: 'arraybuffer'
                             });

        let imageBuffer = Buffer.from(response.data, 'binary');    
        let formData = new FormData();          
        formData.append('image', imageBuffer);

        try {
            let response = await axios({
                method: 'post',
                url: serverUrl,
                data: formData,
            });

            // Do stuff with response.data

        } catch (error) {
            console.log(error)
        }
Run Code Online (Sandbox Code Playgroud)

Aru*_*han 5

您应该通过headers使用爱可信调用formData.getHeaders()发送Content-Type的报头multipart/form-data。没有它,将发送一个Content-Type标头application/x-www-form-urlencoded。您可以将 a responseTypeof传递给stream下载图像并将流添加到表单数据的 axios 调用。

您还可以使用axios.post来简化方法调用。

const url = 'https://pbs.twimg.com/media/EyGoZkzVoAEpgp9.png'
const { data: stream } = await axios.get(url, {
  responseType: 'stream',
})

const formData = new FormData()
formData.append('image', stream)

try {
  const { data } = await axios.post('http://httpbin.org/post', formData, {
    headers: formData.getHeaders(),
  })
  console.log(data)
} catch (error) {
  // handle error
}
Run Code Online (Sandbox Code Playgroud)

使用流编辑 Axios 文件上传