书接上文,背景见:upload/201812131556275305.gif" alt="复制代码" style="margin: 0px; float: left; max-width: 650px; height: auto; border: none !important;" />
新增AI编程课程,引领技术教育新趋势
书接上文,背景见:upload/201812131556275305.gif" alt="复制代码" style="margin: 0px; float: left; max-width: 650px; height: auto; border: none !important;" />
const fs = require("fs") const path = require("path") const mkdirs = (dirname, callback, errback) => { fs.stat(dirname, (err, stats) => { if (err) { mkdirs(path.dirname(dirname), () => { fs.mkdir(dirname, callback) }, errback) } else { if (stats.isDirectory()) { callback() } else { errback() } } }) }fs.createWriteStream返回WriteSteam对象,用于创建文件写入流。
path <string> | <Buffer> | <URL>还是借助Node的fs模块的stat方法,检测当前目录有没有.downloading文件。若有,则创建一个flags为'a'的文件流;若无,则创建一个默认的文件流。
let statDir = function (flag) { fs.stat(file.path + '.downloading', function (err, stats) { if (flag) { if (err) { contents.send('download-error', file.path) stream.end() return } } else { stream = !err ? fs.createWriteStream(file.path + '.downloading', {flags: 'a'}) : fs.createWriteStream(file.path + '.downloading') streams.push(stream) if (!err) { receivedBytes += stats.size } } func() }) }
使用Chromium的原生网络库发出HTTP / HTTPS请求
net 模块是一个发送 HTTP(S) 请求的客户端API。 它类似于Node.js的HTTP 和 HTTPS 模块 ,但它使用的是Chromium原生网络库来替代Node.js的实现,提供更好的网络代理支持。
receivedBytes为.downloading临时文件已下载的文件流大小,chunkSize为分片大小。所以每个分片的请求内容为receivedBytes至receivedBytes + chunkSize - 1。每个分片下载完成后,更新receivedBytes大小。
const request = net.request(url) let start = receivedBytes let end = receivedBytes + chunkSize - 1 request.setHeader('Range', 'bytes=' + start + '-' +