Search code examples
node.jsmulterbusboy

Post file from one server to another,using node.js , needle , busboy/multer


I would like to move a small image from one server to another (both running node). As I search, I haven't found enough. This post remains unanswered.

As I started experimenting I wrote the following to the first server :

app.post("/move_img", function(req, res) {
    console.log("post handled");
    fs.readFile(__dirname + "/img_to_move.jpg", function(err, data) {
        if (err) throw err;
        console.log(data);
        needle.post(server2 + "/post_img", {
           data: data,
           name : "test.jpg"
        }, function(result) {
            console.log(result);
            res.send("ok");
        });
    });  
});

This part seems to be working as I could be writing the data in the same server (using fs.writeFile) recreate the img.

Now as I am trying to handle the post in the other server I have a problem.

Server2:

app.post('/post_img', [ multer({ dest: './uploads/images'}), function(req, res) {

    console.log("body ",req.body) // form fields
    console.log("files ",req.files) // form files
    res.send("got it");
}]);

This way i get an empty object in the files and the following in the body: { 'headers[Content-Type]': 'application/x-www-form-urlencoded', 'headers[Content-Length]': '45009' }

I think I could use busboy as an alternative but I can't make it to work. Any advice, tutorial would be welcome.


Solution

  • I solved my problem by using the following code,

    server1 (using needle) :

    app.post("/move_img", function(req, res) {
        console.log("post handled")
    
        var data = {
            image:{
            file: __dirname + "/img_to_move.jpg",
            content_type: "image/jpeg"}
        }
    
        needle.post(server2 + "/post_img", data, {
            multipart: true
        }, function(err,result) {
            console.log("result", result.body);
        });
    })
    

    Server 2:

    app.use('/post_img',multer({
        dest: '.uploads/images',
        rename: function(fieldname, filename) {
            return filename;
        },
        onFileUploadStart: function(file) {
            console.log(file.originalname + ' is starting ...')
        },
        onFileUploadComplete: function(file) {
            console.log(file.fieldname + ' uploaded to  ' + file.path)
        }
    }));
    
    app.post('/post_img', function(req, res) {
    
        console.log(req.files);
        res.send("File uploaded.");
    
    });
    

    An alternative for the server 1 is the following (using form-data module):

    var form = new FormData();
    form.append('name', 'imgTest.jpg');
    form.append('my_file', fs.createReadStream(__dirname + "/img_to_move.jpg"));
    
    form.submit(frontend + "/post_img", function(err, result) {
        // res – response object (http.IncomingMessage)  //
        console.log(result);
    });