转自: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">() =></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">() =></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>) =></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)