欢迎访问Ningto's博客

Menu
  • 首页
  • 归档
  • 关于
  • 书签
  • 必应壁纸
  • IT聚合
  • 工具
    • 我的工具列表
    • 我的网盘
    • 必应每日壁纸API
    • Html转Markdown
    • 仙尘光标
Menu

golang 下载大文件进度

最后更新 2021-08-13 19:19:37   阅读量 1291

使用io.Copy将下载的部分内容不断写入文件,重载io.Reader的Read函数,使用Read读取数据和大小,通过http的ContentLength获取total大小。

package goutil

import (
    "io"
    "net/http"
    "os"
)

type ChunkReader struct {
    io.Reader
    Total int64
    Offset int64
    Progress func(offset, total int64)
}

func(r *ChunkReader)Read(b []byte)(n int, err error) {
    n, err = r.Reader.Read(b)
    r.Offset += int64(n)
    if r.Progress != nil {
        r.Progress(r.Offset, r.Total)
    }
    return
}

func DownloadFile(url, filepath string, progress func(offset, total int64)) error {
    resp, err := http.Get(url)
    if err != nil {
        return err
    }
    defer resp.Body.Close()

    f, err := os.Create(filepath)
    if err != nil {
        return err
    }
    defer f.Close()
    r := &ChunkReader{
        Reader: resp.Body,
        Total: resp.ContentLength,
        Progress: progress,
    }
    if _, err := io.Copy(f, r); err != nil {
        return err
    }
    return nil
}

    progress := func(offset, total int64) {
        if total > 0 {
            fmt.Printf("\r%.2f%%", float64(offset*100/total))
        } else {
            fmt.Printf("\r%d", offset)
        }
    }
    url := "http://dldir1.qq.com/weixin/Windows/WeChat_3.2.1_update154.dat"
    goutil.DownloadFile(url, "111.dat", progress)
(转载本站文章请注明作者和出处:泞途 - ningto.com)

下一篇 – boost命令行解析
上一篇 – bat常用命令

  1. Go

toningto@outlook.com

标签云

Life Android Javascript Python Windows Product Go Tools Java MQ Qt Node.js Tips Shell Design MongoDB Others Mac Mobile React C/C++ Web Boost Linux IOS Bug Database

推广链接

【腾讯云】云产品限时秒杀,爆款1核2G云服务器,首年99元

多谢支持,用了好几年,服务很稳定支持多设备!

其他

文章RSS

Copyright © 2016 Welcome To Ningto Blog | 鄂ICP备17003086号-2