Я хочу отправить файл с сервера на другой сервер, используя два API, один из которых загружает на конечный сервер, а другой читает данные формы и отправляет их в API, который вызывает первый API
Загрузить на конечный сервер
var storage = multer.diskStorage({
destination: function (req, file, cb) {
mkdirp(configServer.dataDir+ "/tmp", function(err){
console.info("err * : ", err)
if (err)
res.json({success:false, error:err})
cb(null, configServer.dataDir+ "/tmp/")
})
},
filename: function (req, file, cb) {
console.info("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.info("body : ", req.body)
console.info("file : ", req.file)
if (err instanceof multer.MulterError) {
// A Multer error occurred when uploading.
console.info("err 1 : ", err)
} else if (err) {
// An unknown error occurred when uploading.
console.info("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.info("err * : ", err)
if (err)
res.json({success:false, error:err})
cb(null, config.dataDir+ "/tmp/")
})
},
filename: function (req, file, cb) {
console.info("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.info("err 1 : ", err)
} else if (err) {
// An unknown error occurred when uploading.
console.info("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.





Есть ли причина, по которой вы конвертируете двоичный файл в строку в кодировке 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})
})
Хммм ... нужно конвертировать 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. путь) {^ TypeError: Невозможно прочитать свойство 'name' неопределенного в FormData._getContentDisposition (/sr_to_my_projectapi/node_modules/form-data/lib/form_data.j s: 226: 40) в FormData._multiPartHeader (/ srject_to_my_projectapi) form-data / lib / form_data.j s: 177: 33) в FormData.append (/sr_to_my_projectapi/node_modules/form-data/lib/form_data.j s: 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 - null или undefined, проверьте это.
это req.file.buffer, который имеет значение null
Я пробовал это раньше, это ошибка: / sr_to_my_projectapi / node_modules / delayed-stream / lib / delayed _stream.js: 33 source.on ('error', function () {}); ^ TypeError: source.on не является функцией в Function.DelayedStream.create (/ sr_to_my_projectapi / node_modules / delayed-stream / lib / delaye d_stream.js: 33: 10) в FormData.CombinedStream.append