web-dev-qa-db-fra.com

Envoi d'un tampon dans multipart / form-data POST request Node | Express | request

J'ai un tampon que j'ai pris de l'image téléchargée par les utilisateurs, que je veux ensuite envoyer à une autre API dans une requête multipart/form-data POST request.

J'ai cependant des problèmes avec l'objet de demande. Je souhaite envoyer un flux ou un tampon plutôt que d'accéder au système de fichiers du serveur local/créer des fichiers temporaires. Je suis assez nouveau dans le concept des streams.

J'obtiens la bonne réponse de l'envoi de l'API
image_file: fs.createReadStream('image.png')

Mais quand j'essaye:
image_file: data // buffer

Je reçois une erreur de l'API disant que je manque le image_file paramètre.

Veuillez aider!

Docs pour l'API que j'utilise (Face ++)
J'utilise demande pour faire la demande de publication.

Voici mon code en question:

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)
        })
    })
})
7
twocents

Après un peu de jeu, j'ai le code suivant, ça marche bien pour moi. J'ai utilisé le middleware Multer ( https://github.com/expressjs/multer ) pour le téléchargement en plusieurs parties d'origine. Par souci d'intérêt, la demande ne semble pas lire Nice uploading files sauf si vous spécifiez une option de nom de fichier.

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)
    })        
})

Je reçois une réponse qui ressemble à ceci:

{
    "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"
    }]
}

J'ai testé le téléchargement de l'image sur mon serveur local en utilisant curl comme suit:

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