qiniu.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. package osssvr
  2. import (
  3. "context"
  4. "fmt"
  5. "io"
  6. "kettle/oss"
  7. "github.com/qiniu/go-sdk/v7/auth/qbox"
  8. "github.com/qiniu/go-sdk/v7/storage"
  9. )
  10. const (
  11. DEF_REGION = storage.RIDHuabei
  12. )
  13. type QiniuOption func(*QiniuOss)
  14. func WithHTTPS(use bool) QiniuOption {
  15. return func(qo *QiniuOss) {
  16. qo.https = use
  17. }
  18. }
  19. func WithCDN(use bool) QiniuOption {
  20. return func(qo *QiniuOss) {
  21. qo.cdn = use
  22. }
  23. }
  24. func WithRegion(region storage.RegionID) QiniuOption {
  25. return func(qo *QiniuOss) {
  26. qo.region = region
  27. }
  28. }
  29. func NewQiniuOss(accessKey, secretKey, bucket string, opts ...QiniuOption) oss.IOss {
  30. qiniu := &QiniuOss{
  31. accessKey: accessKey,
  32. secretKey: secretKey,
  33. bucket: bucket,
  34. region: DEF_REGION,
  35. https: false,
  36. cdn: false,
  37. }
  38. for _, opt := range opts {
  39. opt(qiniu)
  40. }
  41. return qiniu
  42. }
  43. type QiniuOss struct {
  44. accessKey, secretKey string
  45. bucket string
  46. region storage.RegionID
  47. https bool
  48. cdn bool
  49. }
  50. type qiniuUploadReturn struct {
  51. Key, Hash string
  52. Fsize int
  53. Bucket, Name string
  54. }
  55. func (self *QiniuOss) UploadFile(absPath string, key string, conf *oss.UploadConf) (string, error) {
  56. scope := self.bucket
  57. if conf != nil && conf.Overwrite {
  58. scope = fmt.Sprintf("%s:%s", self.bucket, key)
  59. }
  60. putPolicy := storage.PutPolicy{
  61. Scope: scope,
  62. ReturnBody: `{"key":"$(key)", "hash":"$(etag)", "fsize":$(fsize),"bucket":"$(bucket)","name":"$(x:name)"}`,
  63. }
  64. mac := qbox.NewMac(self.accessKey, self.secretKey)
  65. upToken := putPolicy.UploadToken(mac)
  66. zone, found := storage.GetRegionByID(self.region)
  67. if !found {
  68. }
  69. cfg := storage.Config{
  70. Zone: &zone,
  71. UseHTTPS: self.https,
  72. UseCdnDomains: self.cdn,
  73. }
  74. formUploader := storage.NewFormUploader(&cfg)
  75. putExtra := storage.PutExtra{}
  76. ret := qiniuUploadReturn{}
  77. err := formUploader.PutFile(context.Background(), &ret, upToken, key, absPath, &putExtra)
  78. //fmt.Printf("%v\n", ret)
  79. return ret.Key, err
  80. }
  81. func (self *QiniuOss) Upload(reader io.Reader, len int64, key string, conf *oss.UploadConf) (string, error) {
  82. scope := self.bucket
  83. if conf != nil && conf.Overwrite {
  84. scope = fmt.Sprintf("%s:%s", self.bucket, key)
  85. }
  86. putPolicy := storage.PutPolicy{
  87. Scope: scope,
  88. ReturnBody: `{"key":"$(key)", "hash":"$(etag)", "fsize":$(fsize),"bucket":"$(bucket)","name":"$(x:name)"}`,
  89. }
  90. mac := qbox.NewMac(self.accessKey, self.secretKey)
  91. upToken := putPolicy.UploadToken(mac)
  92. zone, found := storage.GetRegionByID(self.region)
  93. if !found {
  94. }
  95. cfg := storage.Config{
  96. Zone: &zone,
  97. UseHTTPS: self.https,
  98. UseCdnDomains: self.cdn,
  99. }
  100. formUploader := storage.NewFormUploader(&cfg)
  101. putExtra := storage.PutExtra{}
  102. ret := qiniuUploadReturn{}
  103. err := formUploader.Put(context.Background(), &ret, upToken, key, reader, len, &putExtra)
  104. return ret.Key, err
  105. }
  106. func (self *QiniuOss) Delete(key string) error {
  107. mac := qbox.NewMac(self.accessKey, self.secretKey)
  108. cfg := storage.Config{
  109. UseHTTPS: false,
  110. }
  111. bucketManager := storage.NewBucketManager(mac, &cfg)
  112. return bucketManager.Delete(self.bucket, key)
  113. }
  114. func (self *QiniuOss) Exists(key string) bool {
  115. mac := qbox.NewMac(self.accessKey, self.secretKey)
  116. cfg := storage.Config{
  117. UseHTTPS: false,
  118. }
  119. bucketManager := storage.NewBucketManager(mac, &cfg)
  120. fileInfo, err := bucketManager.Stat(self.bucket, key)
  121. return len(fileInfo.Hash) > 0 && err == nil
  122. }