在 multipart/form-data POST 请求节点中发送缓冲区 |快递 |要求

Posted

技术标签:

【中文标题】在 multipart/form-data POST 请求节点中发送缓冲区 |快递 |要求【英文标题】:Sending a buffer in multipart/form-data POST request Node | Express | request 【发布时间】:2018-08-19 10:17:57 【问题描述】:

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

但是我遇到了请求对象的问题。我想发送一个流或缓冲区,而不是访问本地服务器文件系统/创建临时文件。我对流的概念还很陌生。

我从 API 发送中得到了正确的响应image_file: fs.createReadStream('image.png')

但是当我尝试时:image_file: data // buffer

我从 API 中收到一条错误消息,提示我缺少 image_file 参数。

请帮忙!

Docs 用于我正在使用的 API (Face++) 我正在使用request 发出帖子请求。

这是我的代码:

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】:

玩了一会儿之后,我有了以下代码,它对我来说很好用。我使用 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/

【讨论】:

嘿,谢谢。不幸的是,我仍然收到来自 API 的错误:“error_message”:“MISSING_ARGUMENTS: image_url, image_file, image_base64”。我只是不明白为什么它适用于流而不适用于缓冲区。非常感谢您付出的努力! 嗨,是的,我也一样。我最初使用标准 Http 服务器进行了测试,我可以看到图像文件存在。让我再测试一下! 感谢特里,非常感谢您的帮助,这对我来说是坚实的学习黄金。 谢谢,你让我开心! 特里,这个解决方案太棒了。

以上是关于在 multipart/form-data POST 请求节点中发送缓冲区 |快递 |要求的主要内容,如果未能解决你的问题,请参考以下文章

jmeter实现multipart/form-data类型请求

jmeter实现multipart/form-data类型请求

[转]如何使用multipart/form-data格式上传文件

multipart/form-data

如何在 axios 中为 POST - multipart/form-data 设置 MIME 类型?

使用 Windows Mobile 的 HTTPWebrequest (multipart/form-data) 上传文件