You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

obs.go 4.0 kB

4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. // Copyright 2020 The Gitea Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package storage
  5. import (
  6. "io"
  7. "path"
  8. "strconv"
  9. "strings"
  10. "code.gitea.io/gitea/modules/log"
  11. "code.gitea.io/gitea/modules/obs"
  12. "code.gitea.io/gitea/modules/setting"
  13. )
  14. //check if has the object
  15. func ObsHasObject(path string) (bool, error) {
  16. hasObject := false
  17. output, err := ObsCli.ListObjects(&obs.ListObjectsInput{Bucket:setting.Bucket})
  18. if err != nil {
  19. log.Error("ListObjects failed:%v", err)
  20. return hasObject, err
  21. }
  22. for _, obj := range output.Contents {
  23. if path == obj.Key {
  24. hasObject = true
  25. break
  26. }
  27. }
  28. return hasObject, nil
  29. }
  30. func GetObsPartInfos(uuid string, uploadID string) (string, error) {
  31. key := strings.TrimPrefix(path.Join(setting.BasePath, path.Join(uuid[0:1], uuid[1:2], uuid)), "/")
  32. output, err := ObsCli.ListParts(&obs.ListPartsInput{
  33. Bucket: setting.Bucket,
  34. Key: key,
  35. UploadId: uploadID,
  36. })
  37. if err != nil {
  38. log.Error("ListParts failed:", err.Error())
  39. return "", err
  40. }
  41. var chunks string
  42. for _, partInfo := range output.Parts {
  43. chunks += strconv.Itoa(partInfo.PartNumber) + "-" + partInfo.ETag + ","
  44. }
  45. return chunks, nil
  46. }
  47. func NewObsMultiPartUpload(uuid string) (string, error) {
  48. input := &obs.InitiateMultipartUploadInput{}
  49. input.Bucket = setting.Bucket
  50. input.Key = strings.TrimPrefix(path.Join(setting.BasePath, path.Join(uuid[0:1], uuid[1:2], uuid)), "/")
  51. output, err := ObsCli.InitiateMultipartUpload(input)
  52. if err != nil {
  53. log.Error("InitiateMultipartUpload failed:", err.Error())
  54. return "", err
  55. }
  56. return output.UploadId, nil
  57. }
  58. func CompleteObsMultiPartUpload(uuid string, uploadID string) error {
  59. input := &obs.CompleteMultipartUploadInput{}
  60. input.Bucket = setting.Bucket
  61. input.Key = strings.TrimPrefix(path.Join(setting.BasePath, path.Join(uuid[0:1], uuid[1:2], uuid)), "/")
  62. input.UploadId = uploadID
  63. output, err := ObsCli.ListParts(&obs.ListPartsInput{
  64. Bucket: setting.Bucket,
  65. Key: input.Key,
  66. UploadId: uploadID,
  67. })
  68. if err != nil {
  69. log.Error("ListParts failed:", err.Error())
  70. return err
  71. }
  72. for _, partInfo := range output.Parts {
  73. input.Parts = append(input.Parts, obs.Part{
  74. PartNumber: partInfo.PartNumber,
  75. ETag: partInfo.ETag,
  76. })
  77. }
  78. _, err = ObsCli.CompleteMultipartUpload(input)
  79. if err != nil {
  80. log.Error("CompleteMultipartUpload failed:", err.Error())
  81. return err
  82. }
  83. return nil
  84. }
  85. func ObsUploadPart(uuid string, uploadId string, partNumber int, partSize int64, body io.Reader) (string, error) {
  86. input := &obs.UploadPartInput{}
  87. input.PartNumber = partNumber
  88. input.Key = strings.TrimPrefix(path.Join(setting.BasePath, path.Join(uuid[0:1], uuid[1:2], uuid)), "/")
  89. input.UploadId = uploadId
  90. input.Bucket = setting.Bucket
  91. input.PartSize = partSize
  92. input.Body = body
  93. output, err := ObsCli.UploadPart(input)
  94. if err != nil {
  95. log.Error("UploadPart failed:", err.Error())
  96. return "", err
  97. }
  98. return output.ETag, nil
  99. }
  100. func ObsGenMultiPartSignedUrl(uuid string, uploadId string, partNumber int, partSize int64) (string, error) {
  101. /*
  102. input := &obs.CreateSignedUrlInput{}
  103. input.Bucket = setting.Bucket
  104. input.Key = strings.TrimPrefix(path.Join(setting.BasePath, path.Join(uuid[0:1], uuid[1:2], uuid)), "/")
  105. input.Expires = int(PresignedUploadPartUrlExpireTime)
  106. input.Method = obs.HTTP_PUT
  107. input.QueryParams = map[string]string{
  108. "Bucket": input.Bucket,
  109. "Key": input.Key,
  110. "PartNumber": com.ToStr(partNumber,10),
  111. "UploadId": uploadId,
  112. "PartSize": com.ToStr(partSize,10),
  113. }
  114. input.Headers = map[string]string{
  115. }
  116. */
  117. Key := strings.TrimPrefix(path.Join(setting.BasePath, path.Join(uuid[0:1], uuid[1:2], uuid)), "/")
  118. url, err := ObsCli.CreateUploadPartSignedUrl(setting.Bucket, Key, uploadId, partNumber, partSize)
  119. if err != nil {
  120. log.Error("CreateSignedUrl failed:", err.Error())
  121. return "", err
  122. }
  123. log.Info(url)
  124. return url, nil
  125. }