OSSService.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. package service
  2. import (
  3. "crypto/md5"
  4. "encoding/base64"
  5. "fmt"
  6. "github.com/RaymondCode/simple-demo/config"
  7. "github.com/RaymondCode/simple-demo/dao"
  8. "github.com/RaymondCode/simple-demo/util"
  9. "github.com/aliyun/aliyun-oss-go-sdk/oss"
  10. "io"
  11. "os"
  12. "sync"
  13. )
  14. var videoBucket *oss.Bucket
  15. var client *oss.Client
  16. var coverBucket *oss.Bucket
  17. func InitOss() {
  18. accessKey := config.CONFIG.OssConfig.Key
  19. accessSecret := config.CONFIG.OssConfig.Secret
  20. endpoint := config.CONFIG.OssConfig.Endpoint
  21. bucket := config.CONFIG.OssConfig.Bucket
  22. // 创建OSSClient实例。
  23. // yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
  24. // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
  25. var err error
  26. client, err = oss.New(endpoint, accessKey, accessSecret)
  27. if err != nil {
  28. fmt.Println("Error:", err)
  29. fmt.Println("OSS连接失败")
  30. return
  31. }
  32. // 填写存储空间名称,例如examplebucket。
  33. videoBucket, err = client.Bucket(bucket)
  34. if err != nil {
  35. fmt.Println("Error:", err)
  36. fmt.Println("OSSBucket连接失败")
  37. return
  38. }
  39. client, err = oss.New(endpoint, accessKey, accessSecret)
  40. if err != nil {
  41. fmt.Println("Error:", err)
  42. os.Exit(-1)
  43. }
  44. // 填写存储空间名称,例如examplebucket。
  45. coverBucket, err = client.Bucket(bucket)
  46. if err != nil {
  47. fmt.Println("Error:", err)
  48. os.Exit(-1)
  49. }
  50. fmt.Println("已连接bucket" + videoBucket.BucketName)
  51. }
  52. func UploadFile(name string, id int64, wg *sync.WaitGroup) {
  53. //absPath, _ := os.Getwd()
  54. // 依次填写Object的完整路径(例如exampledir/exampleobject.txt)和本地文件的完整路径(例如D:\\localpath\\examplefile.txt)。
  55. // fp :=absPath+name
  56. //strings.ReplaceAll(fp,"\\","\\\\")
  57. //err := bucket.PutObjectFromFile(name,absPath+"\\"+name )
  58. //err := videoBucket.PutObjectFromFile("video/"+name, absPath+"\\video\\"+name)
  59. defer wg.Done()
  60. err := videoBucket.UploadFile("video/"+name, config.PROJECTPATH+config.VIDEO_ADDR+name, 100*1024, oss.Routines(10), oss.Checkpoint(true, ""), oss.ContentMD5(util.CountBase64Val(config.PROJECTPATH+config.VIDEO_ADDR+name))) //该方法支持断点续传,分片上传
  61. if err != nil {
  62. fmt.Println("Error:", err)
  63. fmt.Println("上传OSS失败,文件将保留本地")
  64. dao.Db.Table("video").Where("id", id).Updates(map[string]interface{}{"play_url": config.PROJECTPATH + config.VIDEO_ADDR + name})
  65. return
  66. }
  67. err = videoBucket.SetObjectACL("video/"+name, oss.ACLPublicRead)
  68. if err != nil {
  69. fmt.Println("Error:", err)
  70. os.Exit(-1)
  71. }
  72. err = os.Remove(config.PROJECTPATH + config.VIDEO_ADDR + name)
  73. if err != nil {
  74. fmt.Println("Error:", err)
  75. os.Exit(-1)
  76. }
  77. }
  78. func UploadCover(name string, id int64, wg *sync.WaitGroup) {
  79. absPath, _ := os.Getwd()
  80. // 依次填写Object的完整路径(例如exampledir/exampleobject.txt)和本地文件的完整路径(例如D:\\localpath\\examplefile.txt)。
  81. // fp :=absPath+name
  82. //strings.ReplaceAll(fp,"\\","\\\\")
  83. //err := bucket.PutObjectFromFile(name,absPath+"\\"+name )
  84. fmt.Println("cover/" + name + ".jpeg" + " " + absPath + "\\cover\\" + name + ".jpeg")
  85. err := coverBucket.PutObjectFromFile("cover/"+name+".jpeg", config.PROJECTPATH+config.COVER_ADDR+name+".jpeg")
  86. if err != nil {
  87. fmt.Println("Error:", err)
  88. fmt.Println("封面上传失败,文件将保留本地")
  89. dao.Db.Table("video").Where("id", id).Updates(map[string]interface{}{"cover_url": config.PROJECTPATH + config.COVER_ADDR + name[0:len(name)-4] + ".jpeg"})
  90. return
  91. }
  92. err = coverBucket.SetObjectACL("cover/"+name+".jpeg", oss.ACLPublicRead)
  93. if err != nil {
  94. fmt.Println("Error:", err)
  95. os.Exit(-1)
  96. }
  97. err = os.Remove(config.PROJECTPATH + config.COVER_ADDR + name + ".jpeg")
  98. if err != nil {
  99. fmt.Println("Error:", err)
  100. os.Exit(-1)
  101. }
  102. defer wg.Done()
  103. }
  104. // 直接上传文件,已弃用
  105. func DirectUpload(name string) {
  106. absPath, _ := os.Getwd()
  107. // 依次填写Object的完整路径(例如exampledir/exampleobject.txt)和本地文件的完整路径(例如D:\\localpath\\examplefile.txt)。
  108. // fp :=absPath+name
  109. //strings.ReplaceAll(fp,"\\","\\\\")
  110. //err := bucket.PutObjectFromFile(name,absPath+"\\"+name )
  111. /* objectValue := "0123456789"
  112. mh := md5.Sum([]byte(objectValue))
  113. md5B64 := base64.StdEncoding.EncodeToString(mh[:])
  114. fmt.Println(md5B64)*/
  115. h := md5.New()
  116. f, err := os.Open(absPath + "\\video\\" + name)
  117. if err != nil {
  118. return
  119. }
  120. io.Copy(h, f)
  121. re := h.Sum(nil) //算MD5值
  122. fmt.Printf("%x\n", re)
  123. mdHex := base64.StdEncoding.EncodeToString(h.Sum(nil)[:]) //MD5先转二进制数组再转base64编码
  124. fmt.Println(mdHex)
  125. options := []oss.Option{
  126. oss.ContentMD5(mdHex),
  127. //B076A6BD67245533F9D1ACCF1112248C
  128. }
  129. err = videoBucket.PutObjectFromFile("video/"+"x"+name, absPath+"\\video\\"+name, options...)
  130. if err != nil {
  131. fmt.Println("Error:", err)
  132. os.Exit(-1)
  133. }
  134. /* err = videoBucket.SetObjectACL("video/"+"x"+name, oss.ACLPublicRead)
  135. if err != nil {
  136. fmt.Println("Error:", err)
  137. os.Exit(-1)
  138. }*/
  139. }