【问题标题】:How can I send file to api that use multer in node js?如何将文件发送到在节点 js 中使用 multer 的 api?
【发布时间】:2019-01-08 15:59:49
【问题描述】:

我想将文件从服务器发送到另一台服务器,使用两个 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

如何拥有正确的正文和不是undefined 的“req.file”。

【问题讨论】:

    标签: node.js request multer form-data


    【解决方案1】:

    您有什么理由将二进制文件转换为 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})
    })
    

    【讨论】:

    • 我之前试过这个,这是错误:/sr_to_my_projectapi/node_modules/delayed-stream/lib/delayed_stream.js:33 source.on('error', function() {}); ^ TypeError: source.on is not a function at Function.DelayedStream.create (/sr_to_my_projectapi/node_modules/delayed-stream/lib/delayed_stream.js:33:10) at FormData.CombinedStream.append
    • 嗯...您需要将req.file 转换为流或缓冲区。试试req.file.buffer
    • 感谢您的回复,使用 req.file.buffer,我有这个错误:/sr_to_my_projectapi/node_modules/form-data/lib/form_data.js:226 } else if (options.filename || value.name || value.path) { ^ TypeError: Cannot read property 'name' of undefined at FormData._getContentDisposition (/sr_to_my_projectapi/node_modules/form-data/lib/form_data.js:226:40) at FormData._multiPartHeader ( /sr_to_my_projectapi/node_modules/form-data/lib/form_data.js:177:33) 在 FormData.append (/sr_to_my_projectapi/node_modules/form-data/lib/form_data.js:70
    • 我试过这个:formData: querystring.stringify(obj),这就是返回 req.body : body : { '0': 'c', '1': 'f', ' 2':'','3':'u','4':'s','5':'e','6':'r','7':' ','8':'i','9':'d','10':'=','11':'5','12':'c','13':'2', '14':'c','15':'d','16':'f','17':'9','18':'f','19':'c','20 ':'b','21':'e','22':'e','23':'2','24':'7','25':'4',
    • 关于上一期Cannot read property 'name' of undefined - 当formData字段之一是nullundefined时,请检查它。
    猜你喜欢
    • 2016-06-25
    • 1970-01-01
    • 2017-02-02
    • 2017-08-30
    • 1970-01-01
    • 2020-07-16
    • 2021-10-17
    • 2017-02-01
    • 1970-01-01
    相关资源
    最近更新 更多