怎么通过流, 优雅的实现: 读取文件>计算md5>将文件重命名为md5的值
发布于 7 年前 作者 axetroy 5944 次浏览 来自 问答

在做文件上传.

Koa下可以直接拿到文件对象, 然后保存到本地,代码如下:

  const file = ctx.request.body.files.file;
  const reader = fs.createReadStream(file.path);
  const stream = fs.createWriteStream(path.join(os.tmpdir(), Math.random().toString()));
  reader.pipe(stream);
  console.log('uploading %s -> %s', file.name, stream.path);

想着在中间加上层MD5校验,计算完md5之后, 再以md5的字符串为文件名存储起来。

请教各位, 怎么加上去?

目前是在写流finish之后, 给通过md5重命名…这个总感觉哪里不对, 命名内存

node官网参考:

const crypto = require('crypto');
const fs = require('fs');
const hash = crypto.createHash('sha256');

const input = fs.createReadStream('test.js');
input.pipe(hash).pipe(process.stdout);
3 回复

当然是完成后改名。

From PWA CNode

如果只是重命名防止重复上传,直接md5 就可以了。 这样可以吗?

const crypto = require('crypto');
const fs = require('fs');
const fmd5 = crypto.createHash('md5');
const rs = fs.createReadStream('./test.js'); // test.js 为上传的文件
let filemd5;
rs.on('data', function(chunk) {
    fmd5.update(chunk);
});
rs.on('end', function() {
    filemd5 = fmd5.digest('hex').toUpperCase();
    console.log("文件md5为:"+filemd5)
});
  const file = ctx.request.body.files.file;
  const reader = fs.createReadStream(file.path);

上传的数据都落到磁盘上了,直接用现成工具就好了吧:

md5sum -b PATH|cut -d' ' -f1|xargs mv PATH

代码少,效率绝对比你用 node 处理高。

回到顶部