代码之家  ›  专栏  ›  技术社区  ›  twocents

在多部分/表单数据POST请求节点| Express |请求中发送缓冲区

  •  15
  • twocents  · 技术社区  · 6 年前

    我从用户上传的图像中提取了一个缓冲区,然后我想在多部分/表单数据POST请求中将其发送到另一个API。

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

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

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

    我从API中得到一个错误,说我缺少 image_file 参数

    请帮忙!

    Docs 对于我使用的API(Face++)
    我正在使用 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 回复  |  直到 6 年前
        1
  •  22
  •   Terry Lennox    6 年前

    在做了一点尝试之后,我得到了以下代码,它对我来说工作得很好。我使用了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/