首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确使用Joyent client.createWriteStream(路径、选项)

如何正确使用Joyent client.createWriteStream(路径、选项)
EN

Stack Overflow用户
提问于 2013-11-15 03:36:52
回答 1查看 384关注 0票数 0

我正在尝试使用来自Joyent的Manta的Node.js SDK从一个可读流中编写一个文件。

网页上给出的例子如下:

代码语言:javascript
复制
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将一个文件/对象/字符串已经放入程序中,那么如果我想传递一个可读的流来编写,像这样呢?

代码语言:javascript
复制
 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();
    });
  };

关于这一行,我该怎么做才能奏效:

代码语言:javascript
复制
md5: crypto.createHash('md5').update(message).digest('base64'),

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-15 18:06:52

TL;博士不要发送md5。

如果您不介意阅读两次流,您可以预先计算md5,如下所示:

代码语言:javascript
复制
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。看一下曼塔的Node.js SDK,它似乎是一个可选的字段。请参阅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字段。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19993064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档