Golang如何获取下载进度条?

leavesdrift · 2017-12-30 20:54:54 · 2411 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2017-12-30 20:54:54 的主题,其中的信息可能已经有所发展或是发生改变。

例如一个很简单的下载github上raw文件的函数,conn总是一次性读取到了响应body的所有数据,无法像nodejs那种接收chunk,计算chunk大小来制作进度条。请问在go中是怎样制作下载进度条?

package util

import (
    "io/ioutil"
    "net/http"
    "net/url"
    "path"
)

func Download(URL string)(error) {
    resp, err := http.Get(URL)
    if err != nil {
        return err
    }

    defer resp.Body.Close()

    data, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        return err
    }

    u, err := url.Parse(URL)
    if err != nil {
        return err
    }
    fileName := path.Base(u.Path)

    err = ioutil.WriteFile(fileName, data, 0755)
    if err != nil {
        return err
    }

    return nil
}

我该从tcp入手么?


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2411 次点击  
加入收藏 微博
5 回复  |  直到 2018-01-02 18:48:46
channel
channel · #1 · 7年之前

那你就别 ReadAll,直接通过 Read 读取,一次读一定字节的数据。

leavesdrift
leavesdrift · #2 · 7年之前
channelchannel #1 回复

那你就别 ReadAll,直接通过 Read 读取,一次读一定字节的数据。

有一个疑问啊,我拿到 resp 的时候是数据都已经到resp.Body了么?

momaek
momaek · #3 · 7年之前

拿到的body,不代表数据传完了~~~ 你可以一次读一部分,然后根据 resp header 里面的 Content-Length 来做进度条

leavesdrift
leavesdrift · #4 · 7年之前
momaekmomaek #3 回复

拿到的body,不代表数据传完了~~~ 你可以一次读一部分,然后根据 resp header 里面的 Content-Length 来做进度条

对的,后来拿很大的文件试了下发现会一直阻塞在ioutil.ReadAll(),然后就拿content-length做了一个

momaek
momaek · #5 · 7年之前

使用 bufio 的reader来读,

reader := bufio.NewReader(resp.Body)
defer func(){
        io.Copy(ioutil.Discard, resp.Body)
        resp.Body.Close()
}()


for {
    content,err:=reader.XXXXX()
    if err == io.EOF {
        break
    }
}

类似这样

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传