用Electron开发企业网盘(二)--分片下载

  书接上文,背景见: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()         }     }   }) }
复制代码

2、父级文件夹创建好后,判断当前目录有没有已下载的断点文件,创建文件流。

  fs.createWriteStream返回WriteSteam对象,用于创建文件写入流。

fs.createWriteStream(path[, options])

还是借助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()     })   }
复制代码

3、设定HTTP请求头Range,分片请求文件url。

net

使用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 + '-' +

                    
                
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信