【发布时间】:2015-04-29 06:17:45
【问题描述】:
我正在编写一个node.js 服务器,我在其中接受一个文件以及多部分请求中的 CRC32 校验和。我正在使用busboy 和crc 节点模块来处理节点中的多部分请求和CRC 操作。
在busboy 的finish 事件中,我试图计算已保存文件的 CRC32 校验和,并根据收到的校验和对其进行验证。
我的问题是,在finish 事件中,校验和始终计算为 0。如果我对同一文件手动运行 CRC32 校验和,则校验和计算正确。
这是我用来处理带有 crc32 计算的多部分请求的代码 sn-p:
var busboy = new Busboy({ headers : request.headers});
var saveTo;
var crc32;
busboy.on('file', function (fieldname, file, filename, encoding, mimetype) {
saveTo = path.join('files', '/', filename);
file.pipe(fs.createWriteStream(saveTo));
});
busboy.on('field', function(fieldname, val, fieldnameTruncated, valTruncated) {
if(fieldname == 'checksum') {
crc32 = val;
}
});
busboy.on('finish', function() {
var savedFileCrc32 = crc.crc32(fs.readFileSync(saveTo)).toString(16);
console.log("CRC32 of saved file: " + savedFileCrc32 + " file: " + saveTo);
});
request.pipe(busboy);
我的控制台总是打印CRC32 of saved file: 0 file: files/image.jpg
但是,如果我运行一个节点程序来计算刚刚创建的文件的 CRC32 校验和,它会完美运行并打印校验和。
图像也得到正确保存。在finish 事件中,如果我在saveTo 上打开读取流并读出字节,则图像正在被读取,因此文件已经存在。
知道可能是什么问题吗?
【问题讨论】:
-
如果busboy将写入传递给fs流,它是否知道它何时完成写入?
-
我不确定。我认为@tgo 是正确的。我将尝试同步写入文件并检查是否能解决问题
标签: javascript node.js crc32 busboy