在Node | Express | request中发送一个缓冲区的multipart/form-data POST请求

16

我有一个缓冲区,它是从用户上传的图像中获取的,然后我想在multipart/form-data POST请求中将其发送到另一个API。

然而,我在请求对象方面遇到了问题。我想发送流或缓冲区,而不是访问本地服务器文件系统/创建临时文件。我对流的概念还比较新。

我可以通过以下方式正确发送API:
image_file: fs.createReadStream('image.png')

但是当我尝试使用以下方式时:
image_file: data // buffer

API返回错误,说我缺少'image_file'参数。

请帮忙解决!

所使用API的文档
我使用request进行POST请求。

这是我相关的代码:

app.post('/', (req, res) => {

    const url = 'https://api-us.faceplusplus.com/facepp/v3/detect';

    let data = [];

    req.on('data', (chunk) => {
        data.push(chunk)
    })

    req.on('end', (req, res) => {

        data = Buffer.concat(data);

        const formData = {
            api_key: process.env.FACEPP_API_KEY,
            api_secret: process.env.FACEPP_API_SECRET,
            // image_file: fs.createReadStream('image.png') // works
            image_file: data // doesnt work
        }

        const options = {
            uri: url,
            method: 'POST',
            formData
        }

        request(options, (err, response, body) => {
            if (err) console.log(err)
            console.log(body)
        })
    })
})
1个回答

22
在稍微尝试后,我有了以下的代码,对我而言它工作得很好。我使用了 Multer 中间件 (https://github.com/expressjs/multer) 原来的多部分上传。值得一提的是,如果您不指定文件名选项,请求似乎无法上传文件。
const multer = require('multer');
const upload = multer();

app.post('/', upload.any(), (req, res) => {

    const url = 'https://api-us.faceplusplus.com/facepp/v3/detect';

    console.log('Image upload complete, creating request to: ' + url);

    var formData = {
        api_key: process.env.FACEPP_API_KEY,
        api_secret: process.env.FACEPP_API_SECRET,
        image_file: {
            value: req.files[0].buffer, // Upload the first file in the multi-part post
            options: {
               filename: 'image_file'
            }
      }
    };

    const options = {
        uri: url,
        formData: formData,
        method: 'POST'
    }

    request(options, (err, response, body) => {
        console.log('Request complete');
        if (err) console.log('Request err: ', err);
        console.log(body)
    })        
})

我收到的回复看起来像这样:

{
    "image_id": "GuF0MUPoaTcL/rbbcg+2kA==",
    "request_id": "1520789753,d913cce4-118e-4893-a1ee-d1ace2b6a65b",
    "time_used": 142,
    "faces": [{
        "face_rectangle": {
            "width": 183,
            "top": 125,
            "left": 220,
            "height": 183
        },
        "face_token": "8b8e327edfc10730f344b1465934a478"
    }]
}

我使用curl测试了将图片上传到本地服务器的过程,命令如下:

curl -v -i -F "data=@smiling_woman.jpg" -H "Content-Type: multipart/form-data" -X POST http://localhost:3000/

1
嗨,是的,我也遇到了同样的问题。最初我使用标准的Http服务器进行测试,可以看到图像文件存在。让我再测试一些! - Terry Lennox
我不这么认为,当我指定一个image_url时,它可以正常工作。所以它肯定在做某些事情,只是缺少了一些东西... 我尝试使用image_base64,但它也不喜欢! - Terry Lennox
2
谢谢Terry,我非常感激你的帮助,这对我来说是非常宝贵的学习经验。 - twocents
2
谢谢,你刚刚让我的一天变得更美好了! - hendrikswan
1
Terry,这个解决方案真是太棒了。 - Chirag Suthar
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接