filedown_tool.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. package tool
  2. import (
  3. "fmt"
  4. "github.com/qiniu/go-sdk/v7/storage"
  5. "io"
  6. "net/http"
  7. "os"
  8. "strings"
  9. "time"
  10. )
  11. //此函数为将用户名密码通过指定方式生成鉴权信息:
  12. //func generateSignature(userStringToSign, userAK, userSK string) (res string) {
  13. // key := []byte(userSK)
  14. // mac := hmac.New(sha1.New, key)
  15. // mac.Write([]byte(userStringToSign))
  16. // signature := base64.StdEncoding.EncodeToString(mac.Sum(nil))
  17. // res = "AUTH "+ userAK + ":" + signature
  18. // return
  19. //}
  20. func DownloadFile(url, path string) (pathRes, downloadRes bool) {
  21. var res *http.Response
  22. tt := strings.Split(path, "/")
  23. pathDir := strings.TrimSuffix(path, tt[len(tt)-1])
  24. pathDir = strings.TrimSuffix(pathDir, "/")
  25. err := os.MkdirAll(pathDir, 0777)
  26. if err != nil {
  27. fmt.Printf("mkdir file failed:[%s], error:[%v], path:[%s]\n", pathDir, err, path)
  28. return false, false
  29. } else {
  30. fmt.Printf("mkdir file success:[%s], error:[%v], path:[%s]\n", pathDir, err, path)
  31. }
  32. _ = os.Remove(path)
  33. buffer, err := os.Create(path)
  34. if err != nil {
  35. fmt.Printf("open file failed, error:%v, path:[%s]\n", err, path)
  36. return false, false
  37. } else {
  38. fmt.Printf("open file success, error:%v, path:[%s]\n", err, path)
  39. }
  40. defer buffer.Close()
  41. //flag 0:work; 1:fail; 2:over
  42. flag := 0
  43. for i := 0; i < 3; i++ {
  44. for {
  45. //res, err = http.Get(url)
  46. client := &http.Client{}
  47. req, err2 := http.NewRequest("GET", url, nil)
  48. if err2 != nil {
  49. fmt.Printf("make new http request [%s] error: [%v]\n", url, err2)
  50. return true, false
  51. }
  52. currentDate := time.Now().Format("Mon, 02 Jan 2006 15:04:05 GMT")
  53. //(可选)如需鉴权操作,则通过以下方式生成Authorization所需内容
  54. //othersInfo := "xxx"
  55. // 生成鉴权信息时所需的信息字符串拼接,此处根据具体业务需求更改:
  56. //stringToSign := "GET" + "\n" + "" + "\n" + "" + "\n" + currentDate + "\n" + "/" + othersInfo
  57. //需要鉴权则用这个生成鉴权信息,然后放到请求头中:
  58. //auth := generateSignature(stringToSign, ak, sk)
  59. //fmt.Printf("Authorization:[%s]\n",auth)
  60. req.Header.Add("Date", currentDate)
  61. //req.Header.Add("Authorization", auth)
  62. //req.Header.Add("Content-Type","video/mp4")
  63. res, err2 = client.Do(req)
  64. if err2 != nil {
  65. fmt.Printf("send http req [%s] error: [%v]\n", url, err2)
  66. return true, false
  67. }
  68. if res.StatusCode != 200 {
  69. fmt.Printf("download failed:[%s], StatusCode:[%d],url:[%s]\n", path, res.StatusCode, url)
  70. res.Body.Close()
  71. if i >= 2 {
  72. return true, false
  73. } else {
  74. flag = 1
  75. break
  76. }
  77. }
  78. flag = 0
  79. break
  80. }
  81. if flag == 1 {
  82. time.Sleep(1 * time.Second)
  83. continue
  84. }
  85. buf := make([]byte, 102400)
  86. for {
  87. n, err := res.Body.Read(buf)
  88. if err != nil && err != io.EOF {
  89. fmt.Printf("Download failed:[%s], error:%v, path:[%s]\n", url, err, path)
  90. res.Body.Close()
  91. if i >= 2 {
  92. return true, false
  93. } else {
  94. flag = 1
  95. break
  96. }
  97. }
  98. buffer.Write(buf[:n])
  99. if err == io.EOF {
  100. res.Body.Close()
  101. flag = 2
  102. break
  103. }
  104. }
  105. if flag == 1 {
  106. time.Sleep(1 * time.Second)
  107. continue
  108. } else if flag == 2 {
  109. break
  110. }
  111. }
  112. fmt.Printf("Download success:[%s], path:[%s]\n", url, path)
  113. return true, true
  114. }
  115. func Zone(zoneStr string) *storage.Region {
  116. zone := &storage.ZoneHuadong
  117. switch {
  118. case zoneStr == "hd":
  119. zone = &storage.ZoneHuadong
  120. case zoneStr == "hb":
  121. zone = &storage.ZoneHuabei
  122. case zoneStr == "hn":
  123. zone = &storage.ZoneHuanan
  124. case zoneStr == "xkp":
  125. zone = &storage.ZoneXinjiapo
  126. default:
  127. zone = &storage.ZoneHuadong
  128. }
  129. return zone
  130. }