Golang 다운로드 파일 최 적 화 됨

2526 단어 golang
XXX.download , XXX package mainimport (     "crypto/md5"     "errors"     "fmt"     "io"     "io/ioutil"     "net/http"     "os"     "strconv"     "time" )  func IsFileExist(filename string, filesize int64) bool {     info, err := os.Stat(filename)     if os.IsNotExist(err) {         fmt.Println(info)         return false     }     if filesize == info.Size() {         fmt.Println(" !", info.Name(), info.Size(), info.ModTime())         return true     }     del := os.Remove(filename)     if del != nil {         fmt.Println(del)     }     return false } func downloadFile(url string, localPath string, fb func(length, downLen int64)) error {     var (         fsize   int64         buf     = make([]byte, 32*1024)         written int64     )     tmpFilePath := localPath + ".download"     fmt.Println(tmpFilePath)     // http client     client := new(http.Client)     //client.Timeout = time.Second * 60 //     //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)     }     if IsFileExist(localPath, fsize) {         return err     }     fmt.Println("fsize", fsize)     //     file, err := os.Create(tmpFilePath)     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)     }     fmt.Println(err)     if err == nil {         file.Close()         err = os.Rename(tmpFilePath, localPath)         fmt.Println(err)     }     return err }

좋은 웹페이지 즐겨찾기