Как правильно использовать 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 поле.

Другие вопросы по тегам