golang 进度下载文件
2018-03-11 00:00
169 查看
//一个没找到工作的下午独自撸起来的代码 //很不美观临时作品 package main import ( "net/http" "fmt" "os" "errors" "io" "strconv" ) func main() { downloadFile("http://localhost:8089/ThunderSpeed1.0.35.366.exe", func(length, downLen int64) { fmt.Println(length, downLen, float32(downLen)/float32(length)) }) } func downloadFile(url string, fb func(length, downLen int64)) error { var ( fsize int64 buf = make([]byte, 32*1024) written int64 ) //创建一个http client client := new(http.Client) //get方法获取资源 resp, err := client.Get(url) if err != nil { return err } //读取服务器返回的文件大小 fsize, err = strconv.ParseInt(resp.Header.Get("Content-Length"), 10, 32) if err != nil { fmt.Println(err) } //创建文件 file, err := os.Create("test.exe") if err != nil { return err } defer file.Close() if resp.Body == nil { return errors.New("body is null") } defer resp.Body.Close() //下面是 io.copyBuffer() 的简化版本 for { //读取bytes nr, er := resp.Body.Read(buf) if nr > 0 { //写入bytes nw, ew := file.Write(buf[0:nr]) //数据长度大于0 if nw > 0 { written += int64(nw) } //写入出错 if ew != nil { err = ew break } //读取是数据长度不等于写入的数据长度 if nr != nw { err = io.ErrShortWrite break } } if er != nil { if er != io.EOF { err = er } break } //没有错误了快使用 callback fb(fsize, written) } return err }
相关文章推荐
- iOS开发之网络编程--4、NSURLSessionDataTask实现文件下载(离线断点续传下载) <进度值显示优化>
- libcurl--下载文件并实现进度条
- c# 文件下载 进度及速度
- 安卓文件下载,显示下载进度
- 大文件 and 多下载任务的封装(二)--观察者模式--实现下载进度的实时更新
- 下载文件并显示进度条
- C#下载文件(可显示进度)的方法实现
- Android 下载文件至SD卡,并用progressBar显示下载进度
- golang 下载和上传,处理多文件上传
- libcurl 通过http协议下载文件并显示下载进度
- Android 下载网络url文件并显示进度
- NSURLConnection下载文件时,如何显示进度
- Android中使用AsyncTask实现文件下载以及进度更新提示
- Android APK文件下载 并自动安装 显示文件下载进度,速度,以及花费时间
- Android OkHttp文件上传与下载的进度监听扩展
- python 下载文件到本地,并显示进度
- python实现进度条--主要用在上传下载文件
- android自定义Dialog实现文件下载和下载进度
- Windows Phone 8 下载文件进度
- 文件下载之使用AsyncTask并在进度对话框中显示下载进度