Golang語言社群--golang 進度下載檔案
阿新 • • 發佈:2022-05-04
大家好,我是Golang社群主編彬哥,本篇給大家轉載一篇關於檔案下載相關的文章。
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 }