| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 | package toolimport (	"fmt"	"github.com/qiniu/go-sdk/v7/storage"	"io"	"net/http"	"os"	"strings"	"time")//此函数为将用户名密码通过指定方式生成鉴权信息://func generateSignature(userStringToSign, userAK, userSK string) (res string) {//	key := []byte(userSK)//	mac := hmac.New(sha1.New, key)//	mac.Write([]byte(userStringToSign))//	signature := base64.StdEncoding.EncodeToString(mac.Sum(nil))//	res = "AUTH "+ userAK + ":" + signature//	return//}func DownloadFile(url, path string) (pathRes, downloadRes bool) {	var res *http.Response	tt := strings.Split(path, "/")	pathDir := strings.TrimSuffix(path, tt[len(tt)-1])	pathDir = strings.TrimSuffix(pathDir, "/")	err := os.MkdirAll(pathDir, 0777)	if err != nil {		fmt.Printf("mkdir file failed:[%s], error:[%v], path:[%s]\n", pathDir, err, path)		return false, false	} else {		fmt.Printf("mkdir file success:[%s], error:[%v], path:[%s]\n", pathDir, err, path)	}	_ = os.Remove(path)	buffer, err := os.Create(path)	if err != nil {		fmt.Printf("open file failed, error:%v, path:[%s]\n", err, path)		return false, false	} else {		fmt.Printf("open file success, error:%v, path:[%s]\n", err, path)	}	defer buffer.Close()	//flag 0:work; 1:fail; 2:over	flag := 0	for i := 0; i < 3; i++ {		for {			//res, err = http.Get(url)			client := &http.Client{}			req, err2 := http.NewRequest("GET", url, nil)			if err2 != nil {				fmt.Printf("make new http request [%s] error: [%v]\n", url, err2)				return true, false			}			currentDate := time.Now().Format("Mon, 02 Jan 2006 15:04:05 GMT")			//(可选)如需鉴权操作,则通过以下方式生成Authorization所需内容			//othersInfo := "xxx"			//	生成鉴权信息时所需的信息字符串拼接,此处根据具体业务需求更改:			//stringToSign := "GET" + "\n" + "" + "\n" + "" + "\n" + currentDate + "\n" + "/" + othersInfo			//需要鉴权则用这个生成鉴权信息,然后放到请求头中:			//auth := generateSignature(stringToSign, ak, sk)			//fmt.Printf("Authorization:[%s]\n",auth)			req.Header.Add("Date", currentDate)			//req.Header.Add("Authorization", auth)			//req.Header.Add("Content-Type","video/mp4")			res, err2 = client.Do(req)			if err2 != nil {				fmt.Printf("send http req [%s] error: [%v]\n", url, err2)				return true, false			}			if res.StatusCode != 200 {				fmt.Printf("download failed:[%s], StatusCode:[%d],url:[%s]\n", path, res.StatusCode, url)				res.Body.Close()				if i >= 2 {					return true, false				} else {					flag = 1					break				}			}			flag = 0			break		}		if flag == 1 {			time.Sleep(1 * time.Second)			continue		}		buf := make([]byte, 102400)		for {			n, err := res.Body.Read(buf)			if err != nil && err != io.EOF {				fmt.Printf("Download failed:[%s], error:%v, path:[%s]\n", url, err, path)				res.Body.Close()				if i >= 2 {					return true, false				} else {					flag = 1					break				}			}			buffer.Write(buf[:n])			if err == io.EOF {				res.Body.Close()				flag = 2				break			}		}		if flag == 1 {			time.Sleep(1 * time.Second)			continue		} else if flag == 2 {			break		}	}	fmt.Printf("Download success:[%s], path:[%s]\n", url, path)	return true, true}func Zone(zoneStr string) *storage.Region {	zone := &storage.ZoneHuadong	switch {	case zoneStr == "hd":		zone = &storage.ZoneHuadong	case zoneStr == "hb":		zone = &storage.ZoneHuabei	case zoneStr == "hn":		zone = &storage.ZoneHuanan	case zoneStr == "xkp":		zone = &storage.ZoneXinjiapo	default:		zone = &storage.ZoneHuadong	}	return zone}
 |