Как опубликовать обычный файловый буфер вместо двоичного файла при публикации пакета запроса nodejs/npm?
Я использую пакет запросов npm для отправки файла-буфера в REST API, написанный с использованием пакета meteor.js restivus. Мой клиентский код node.js, который публикует API, выглядит следующим образом:
url = ' http://localhost:3000/api/v1/images/ ';fs.readFile('./Statement.odt', function read(err, data) {
if (err) {
throw err;
}
console.log(data); //At this stage the file is still a buffer - which is correct
var file = data;
request.post({
uri: url,
headers: {
'X-User-Id': userId,
'X-Auth-Token': authToken
},
form: {
file: file, //Inside the request.post the file is converted to binary encoding
name:"Statement.odt"
}
}, function(err, httpResponse, body) {
if (err) {
return console.error('post failed:', err);
}
console.log('Get successful! Server responded with:', body);
});
});
Проблема / проблема здесь в том, что внутри request.post файл преобразуется в двоичный кодированный двоичный объект. Смотрите мои комментарии в свойстве "form:" первого аргумента "request.post" в приведенном выше коде. Это становится проблемой на моем сервере meteor.js, где файл требуется в качестве буфера, а не в двоичном кодированном файле. (Для информации: я использую GridFS Ostr-io / files для хранения файла - он требует, чтобы файл был буфером)
Если нет другого способа, кроме как передать файл в виде закодированной строки, есть ли способ преобразовать этот закодированный BLOB-объект обратно в сторону буфера на сервере, где я использую / говорим meteor.js? Пожалуйста помоги!
Если вам нужна дополнительная информация, пожалуйста, дайте мне знать, я предоставлю.
1 ответ
Я нашел ответ на свой вопрос. Мой клиентский код node.js, который публикует в API, изменяется следующим образом:
url = 'http://localhost:3000/api/v1/images/';
fs.readFile('./Statement.odt', function read(err, data) {
if (err) {
throw err;
}
console.log(data);
//var file = new Buffer(data).toString('base64');
var file = data;
//var file = fs.readFileSync('./Statement.odt',{ encoding: 'base64' });
var req = request.post({
uri: url,
headers: {
'X-User-Id': userId,
'X-Auth-Token': authToken
},
/*form: { //Post to the body instead of the form
file: file,
name:"Statement.odt",
},*/
body: file, //Post to the body instead of the form
json:true //Set json to true
//encoding: null
}, function(err, httpResponse, body) {
if (err) {
return console.error('post failed:', err);
}
console.log('Get successful! Server responded with:', body);
});
});
На стороне сервера получите доступ к данным json следующим образом и преобразуйте файл обратно в буфер:
var bufferOriginal = Buffer.from(this.request.body.data)
Обратите внимание, что когда вы делаете console.log(bufferOriginal), вы получаете вывод файла, закодированного в utf8, но когда вы ссылаетесь / используете bufferOriginal в любом месте кода, он распознается как файловый буфер, который выглядит примерно так:
<Buffer 50 4b 03 04 14 00 00 08 00 00 00 55 f6 4c 5e c6 32 0c 27 00 00 00 27 00 00 00 08 00 00 00 6d 69 6d 65 74 79 70 65 61 70 70 6c 69 63 61 74 69 6f 6e 2f ... >
Спасибо @Dr.Dimitru за то, что подтолкнули меня в направлении решения и указали, что this.request.body уже json