Nodejs - Handle and send multipart request,

10,402

Solution 1

try this

const express = require("express");
const app = express();
const bodyParser = require('body-parser');
var multer  = require('multer')();
const FormData = require('form-data');
const axios = require('axios');
const fs = require('fs');

app.use(bodyParser.json());

app.post('/fileUpload' , multer.single('fileFieldName'), (req , res) => {
    const fileRecievedFromClient = req.file; //File Object sent in 'fileFieldName' field in multipart/form-data
    console.log(req.file)

    let form = new FormData();
    form.append('fileFieldName', fileRecievedFromClient.buffer, fileRecievedFromClient.originalname);

    axios.post('http://server2url/fileUploadToServer2', form, {
            headers: {
                'Content-Type': `multipart/form-data; boundary=${form._boundary}`
            }
        }).then((responseFromServer2) => {
            res.send("SUCCESS")
        }).catch((err) => {
            res.send("ERROR")
        })
})

const server = app.listen(3000, function () {
    console.log('Server listening on port 3000');
});

Solution 2

I think you need to insert header like that:

const formData = new FormData();

..

await axios.post("{url}", formData, {
      headers: {
        "Content-Type": `multipart/form-data; boundary=${formData.getBoundary()}`,
      },
    });
Share:
10,402

Related videos on Youtube

user2746912
Author by

user2746912

Updated on June 04, 2022

Comments

  • user2746912
    user2746912 almost 2 years

    My application runs on Nodejs server and Nodejs also acts as a middle ware/proxy for requests originating from the application. So from browser all REST calls goes to NodeJs, and then to Java API.

    I see an issue handling requests with multipart-form data.

    I intercept the file upload REST call from browser in my nodejs, parse the request using multiparty library, and form a form-data object from the file upload request.

    I am using https module to send data to API, so how do I send the form data request to API, via https ?

    I send the Content-Type as multipart/form-data; boundary=----WebKitFormBoundary6fyv95baqEpoGJaK, got from browser.

    var https = require('https');
    var multiparty = require('multiparty');
    var FormData = require('form-data');
    app.post('/v1/filesUpload', (request, response) => {
    let apiOptions ={
        headers: {
         'Content-Type': request.headers['Content-Type'],
          'host' : ...
          'path': ...    
         .
         .
         .
          }
    }
    let form = new multiparty.Form();
    let formdataReq = new FormData();
     Object.keys(fields).forEach(function (name) {
              console.log('got field named ' + fields[name]);
              formdataReq.append(name, fields[name].toString());
            });
    
            formdataReq.append('file', JSON.stringify(files));    
            const req = https.request(apiOptions, (res) => {
    
            });    
            req.write(querystring.stringify(formDataReq));
          }catch (e) {
            console.log(e);
          }
        });
    
    });
    
  • Rojelo
    Rojelo about 4 years
  • user2746912
    user2746912 about 4 years
    Thank you so much, when we do a file upload as a form data, apart from the file we also send additional params in the form data like userid, form id, so how do I read both files and fields using Multer?
  • Gaff
    Gaff almost 3 years
    Thanks! FWIW, I had to use form.getBoundary() rather than form._boundary