慕容的工作随笔

慕容的工作随笔

记录学习和工作

Node.js中文件下载进度获取 转

转自:https://www.cnblogs.com/ybixian/p/12296205.html

原文:https://www.jianshu.com/p/36cc5042ef12

/**
 * 文件下载
 * @param {*} url 下载地址
 * @param {*} dest 文件保存的路径,如:D:/download/xxx
 * @param {*} cb 回调函数参数1为区别哪个加试,如:'download'下载结束,'data'下载进度,'finish'文件写入结束
 */
const downloadFile = (url, dest, cb = () =>{}) => {
  // 确保dest路径存在
  const file = fs.createWriteStream(dest)
  const urlImage = 'https://seven-actions.oss-cn-shenzhen.aliyuncs.com/sa_rail_work_sheet_resource/b517de9a-2abc-11ea-8e3c-0242ac140007.mp4'

https.get(urlImage, (res) => {
if (res.statusCode !== 200) {
cb(response.statusCode)
return
}

<span class="hljs-comment">// 进度</span>
<span class="hljs-keyword">const</span> len = <span class="hljs-built_in">parseInt</span>(res.headers[<span class="hljs-string">'content-length'</span>]) <span class="hljs-comment">// 文件总长度</span>
<span class="hljs-keyword">let</span> cur = <span class="hljs-number">0</span>
<span class="hljs-keyword">const</span> total = (len / <span class="hljs-number">1048576</span>).toFixed(<span class="hljs-number">2</span>) <span class="hljs-comment">// 转为M 1048576 - bytes in  1Megabyte</span>
res.on(<span class="hljs-string">'data'</span>, <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">chunk</span>) </span>{
  cur += chunk.length
  <span class="hljs-keyword">const</span> progress = (<span class="hljs-number">100.0</span> * cur / len).toFixed(<span class="hljs-number">2</span>) <span class="hljs-comment">// 当前进度</span>
  <span class="hljs-keyword">const</span> currProgress = (cur / <span class="hljs-number">1048576</span>).toFixed(<span class="hljs-number">2</span>) <span class="hljs-comment">// 当前了多少</span>
  cb(<span class="hljs-string">'data'</span>, progress, currProgress, total)
})

res.on(<span class="hljs-string">'end'</span>, <span class="hljs-function">() =&gt;</span> {
  <span class="hljs-comment">// console.log('下载结束')</span>
  cb(<span class="hljs-string">'download'</span>)
})

<span class="hljs-comment">// 超时,结束等</span>
file.on(<span class="hljs-string">'finish'</span>, <span class="hljs-function">() =&gt;</span> {
  <span class="hljs-comment">// console.log('文件写入结束')</span>
  file.close(cb(<span class="hljs-string">'finish'</span>))
}).on(<span class="hljs-string">'error'</span>, <span class="hljs-function">(<span class="hljs-params">err</span>) =&gt;</span> {
  fs.unlink(dest)
  <span class="hljs-keyword">if</span> (cb) cb(<span class="hljs-string">'error'</span>, err.message)
})
res.pipe(file)

})
}

调用

    downloadFile(download_url, savaFilePath + ${data.package_version}.apk, (state, pro, currPro, total) => {
      if (state == 'data') {
        // 下载进度
        console.log(pro, currPro, total)
      }
    })

评论 (0)

还没有评论,来做第一个吧。

发表评论

提交后需管理员审核通过后显示