Как я могу отправить файл в API, которые используют multer в узле JS? - PullRequest
0 голосов
/ 08 января 2019

Я хочу отправить файл с сервера на другой сервер, используя два API-интерфейса, один из которых загружается на конечный сервер, а другой - читает данные формы и отправляет его в API-интерфейс, вызывающий первый API-интерфейс

Загрузить на конечный сервер

var storage = multer.diskStorage({
    destination: function (req, file, cb) {
        mkdirp(configServer.dataDir+ "/tmp", function(err){
            console.log("err * : ", err)
            if(err)
                res.json({success:false, error:err})
            cb(null, configServer.dataDir+ "/tmp/")
        })
    },
    filename: function (req, file, cb) {
        console.log("file**", file)
        cb(null, file.fieldname + '-' + Date.now())
    }
})

var upload = multer({ storage: storage }).single('file');

exports.upload_in_server = function (req, res) {

    upload(req, res, function (err) {

         console.log("body : ", req.body)
         console.log("file : ", req.file)

        if (err instanceof multer.MulterError) {
            // A Multer error occurred when uploading.
            console.log("err 1 : ", err)
        } else if (err) {
            // An unknown error occurred when uploading.
            console.log("err 2 : ", err)
        }

         res.json({success: true})

    })

}

router.post("/myurl/uploadInServer",  UserController.upload_in_server);

В следующем API вызывается для отправки файла на конечный сервер

var storage2 = multer.diskStorage({
    destination: function (req, file, cb) {
        mkdirp(config.dataDir+ "/tmp", function(err){
            console.log("err * : ", err)
            if(err)
                res.json({success:false, error:err})
            cb(null, config.dataDir+ "/tmp/")
        })
    },
    filename: function (req, file, cb) {
        console.log("file**", file)
        cb(null, file.fieldname + '-' + Date.now())
    }
})

var upload2 = multer({ storage: storage2 }).single('file');

exports.user_coffre_fort_create_file2 = function (req, res) {

var querystring = require('querystring');

    upload2(req, res, function (err) {

        if (err instanceof multer.MulterError) {
            // A Multer error occurred when uploading.
            console.log("err 1 : ", err)
        } else if (err) {
            // An unknown error occurred when uploading.
            console.log("err 2 : ", err)
        }

        var FormData = require('form-data');

        var form = new FormData();

        const encoded = req.file.toString('base64')

        form.append('file', encoded);

        form.append('Name', "Lagaf");
        form.append('Surname', "Vincent");
        form.append('birthdate', "13/01/1960");

        request({
            url: "/myurl/uploadInServer",
            method: 'POST',
            json: querystring.stringify(form),
            headers: {"Content-Type": "application/x-www-form-urlencoded", "Authorization": my_tokentoken}
            //
        }, function (err, stdout, body) {
            res.json({success:true})
        })
    })
}

Это то, что я получаю на сервере, тело неверно, а файл не определен

body :  { '"_overheadLength': '420',
  _valueLength: '37',


writable: 'false',
  readable: 'true',
  dataSize: '0',
  maxDataSize: '2097152',
  pauseStreams: 'true',
  _released: 'false',
  _streams: 
   [ '----------------------------081543624686364985445462\r\nContent-Disposition: form-data; name="file"\r\n\r\n',
     '[object Object]',
     '',
     '----------------------------081543624686364985445462\r\nContent-Disposition: form-data; name="Name"\r\n\r\n',
     'Lagaf',
     '',
     '----------------------------081543624686364985445462\r\nContent-Disposition: form-data; name="Surname"\r\n\r\n',
     'Vincent',
     '',
     '----------------------------081543624686364985445462\r\nContent-Disposition: form-data; name="birthdate"\r\n\r\n',
     '13/01/1960',
     '' ],
  _currentStream: '',
  _boundary: '--------------------------081543624686364985445462"' }
files :  undefined

Как получить правильное тело и 'req.file', который не undefined.

1 Ответ

0 голосов
/ 08 января 2019

Есть ли причина, по которой вы конвертируете двоичный файл в строку в кодировке base64? И почему urlencoded используется вместо multipart/form-data?

Попытка:

request({
    url: "/myurl/uploadInServer",
    method: 'POST',
    formData : {
        file: req.file,
        'Name': 'Lagaf',
        'Surname': 'Vincent',
        'birthdate': '13/01/1960'
    },
    headers: {
        "Content-Type": "multipart/form-data"
        "Authorization": my_tokentoken
    }
}, function (err, stdout, body) {
    res.json({success:true})
})
...