Как правильно использовать Joyent Manta client.createWriteStream(путь, параметры)
Я пытаюсь использовать Nota.js SDK от Manta от Joyent, чтобы записать файл из читаемого потока.
Пример, приведенный на веб-странице:
var MemoryStream = require('memorystream');
var message = 'Hello World'
var opts = {
copies: 3,
headers: {
'access-control-allow-origin': '*',
'access-control-allow-methods': 'GET'
},
md5: crypto.createHash('md5').update(message).digest('base64'),
size: Buffer.byteLength(message),
type: 'text/plain'
};
var stream = new MemoryStream();
var w = client.createWriteStream('/jill/stor/hello_world.txt', opts);
stream.pipe(w);
w.once('close', function (res) {
console.log('all done');
});
stream.end(message);
Но это тот случай, когда мы использовали writeStream, чтобы поместить файл / объект / строку уже в программу, что, если я хочу передать читаемый поток для записи, как этот?
function saveCopyToManta(cb){
var stream = fs.createReadStream('/tmp/' + filename);
var opts = {
copies: 3,
headers: {
'access-control-allow-origin': '*',
'access-control-allow-methods': 'GET'
},
md5: crypto.createHash('md5').update(message).digest('base64'),
size: filesize,
type: 'text/plain'
};
client.put('/someuser/stor/logs/+filename, stream, opts, function (err) {
if(err) cb(err);
else cb();
});
};
Что я должен сделать, чтобы это работало, относительно этой строки:
md5: crypto.createHash('md5').update(message).digest('base64'),
Спасибо
1 ответ
TL;DR не отправлять MD5.
Если вы не против прочитать поток дважды, вы можете заранее рассчитать md5 следующим образом:
var fs = require('fs');
var crypto = require('crypto');
function calculateStreamHash(readableStream, algorithm, encoding, cb) {
var hash = crypto.createHash(algorithm);
readableStream.on('data', updateHash);
readableStream.on('end', finish);
function updateHash(d) {
hash.update(d);
}
function finish() {
var d = hash.digest(encoding);
cb(d);
}
}
calculateStreamHash(fs.createReadStream('/tmp/' + filename), 'md5', 'base64', function(md5) {
// use md5
});
Если чтение потока дважды невозможно, я советую вообще не отправлять MD5. Если посмотреть на Nota.js SDK от Manta, то это необязательное поле. См. https://github.com/joyent/node-manta/blob/master/lib/client.js#L169
На самом деле, это выглядит так в конкретном методе, который вы используете createWriteStream()
, md5
Поле опций полностью игнорируется. См. https://github.com/joyent/node-manta/blob/master/lib/client.js#L1399
Так что вы, вероятно, должны игнорировать это md5
поле.