broker.createService({ name: "file", actions: { get(ctx) { const fileName = "d:/src.zip"; const stat = fs.statSync(fileName); let uploadedSize = 0; const stream = fs.createReadStream(fileName); stream.on("data", chunk => { uploadedSize += chunk.length; this.logger.info("SEND: ", Number(uploadedSize / stat.size * 100).toFixed(0) + `% (${chunk.length})`); }); stream.on("close", () => { getSHA(fileName).then(hash => { broker.logger.info("File sent."); broker.logger.info("SHA:", hash); broker.logger.info("Size:", stat.size); }); }); return stream; } } });
/** * Copy file via streams * @param {string} src - Path to the source file * @param {string} dst - Path to the destination file. */ const copyFile = (src, dst, callback) => { // cbCalled flag and runCb helps to run cb only once. let cbCalled = false; let runCb = (err) => { if (cbCalled) return; cbCalled = true; callback(err); }; // Create read stream let readable = fs.createReadStream(src); readable.on('error', runCb); // Create write stream let writable = fs.createWriteStream(dst); writable.on('error', (err)=>{ readable.destroy(); runCb(err); }); writable.on('close', () => runCb()); // Copy file via piping streams. readable.pipe(writable); }
/** * 文件md5 */ function md5File (filename, callback) { var sum = crypto.createHash('md5'); if (callback && typeof callback === 'function') { var fileStream = fs.createReadStream(filename); fileStream.on('error', function (err) { return callback(err, null); }); fileStream.on('data', function (chunk) { try { sum.update(chunk); } catch (ex) { return callback(ex, null); } }); fileStream.on('end', function () { return callback(null, sum.digest('hex')); }); } else { sum.update(fs.readFileSync(filename)); return sum.digest('hex'); } }
stream.on('error', /* istanbul ignore next */ function (e) { res.statusCode = 500; res.end('500 Server Internal Error: <br><pre>' + e.stack + '</pre>'); next(); });
/* broker.start() .delay(2000) .then(() => { return broker.call("stream.listFiles"); }) .then(res => { broker.logger.info(res); broker.stop(); }); */ function getSHA(fileName) { return new Promise((resolve, reject) => { let hash = crypto.createHash("sha256"); let stream = fs.createReadStream(fileName); stream.on("error", err => reject(err)); stream.on("data", chunk => hash.update(chunk)); stream.on("end", () => resolve(hash.digest("base64"))); }); }