| | |
| | | import ( |
| | | "bytes" |
| | | "encoding/json" |
| | | "errors" |
| | | "fmt" |
| | | "io" |
| | | "net/http" |
| | | "strconv" |
| | | "time" |
| | | |
| | | "gat1400Exchange/pkg/logger" |
| | | "gat1400Exchange/vo" |
| | |
| | | |
| | | return body, nil |
| | | } |
| | | |
| | | func ImageDownload(downloadUrl string, fb func(length, downLen int64)) ([]byte, error) { |
| | | var ( |
| | | fSize int64 |
| | | buf = make([]byte, 10*1024) |
| | | buffer bytes.Buffer |
| | | written int64 |
| | | ) |
| | | |
| | | request, err := http.NewRequest("GET", downloadUrl, nil) |
| | | if err != nil { |
| | | return nil, err |
| | | } |
| | | |
| | | //创建一个http client |
| | | client := new(http.Client) |
| | | client.Timeout = time.Second * 600 //设置超时时间 |
| | | |
| | | // get方法获取资源 |
| | | resp, err := client.Do(request) |
| | | if err != nil { |
| | | return nil, err |
| | | } |
| | | |
| | | if resp.StatusCode != 200 { |
| | | return nil, errors.New(fmt.Sprintf("请求失败, 状态码:%d", resp.StatusCode)) |
| | | } |
| | | |
| | | //读取服务器返回的文件大小 |
| | | fSize, err = strconv.ParseInt(resp.Header.Get("Content-Length"), 10, 32) |
| | | if err != nil { |
| | | return nil, err |
| | | } |
| | | |
| | | if resp.Body == nil { |
| | | return nil, 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 := buffer.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 |
| | | if fb != nil { |
| | | fb(fSize, written) |
| | | } |
| | | } |
| | | |
| | | return buffer.Bytes(), err |
| | | } |