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.

multiPartUploader.go 2.1 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package cos
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/tencentyun/cos-go-sdk-v5"
  6. log "gitlink.org.cn/cloudream/common/pkgs/logger"
  7. cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
  8. "gitlink.org.cn/cloudream/storage/common/pkgs/storage/types"
  9. "io"
  10. "net/http"
  11. "net/url"
  12. )
  13. type MultiPartUploader struct {
  14. client *cos.Client
  15. }
  16. func NewMultiPartUpload(address *cdssdk.COSAddress) *MultiPartUploader {
  17. // cos的endpoint已包含bucket名,会自动将桶解析出来
  18. u, _ := url.Parse(address.Endpoint)
  19. b := &cos.BaseURL{BucketURL: u}
  20. client := cos.NewClient(b, &http.Client{
  21. Transport: &cos.AuthorizationTransport{
  22. SecretID: address.AK,
  23. SecretKey: address.SK,
  24. },
  25. })
  26. return &MultiPartUploader{
  27. client: client,
  28. }
  29. }
  30. func (c *MultiPartUploader) InitiateMultipartUpload(objectName string) (string, error) {
  31. v, _, err := c.client.Object.InitiateMultipartUpload(context.Background(), objectName, nil)
  32. if err != nil {
  33. log.Error("Failed to initiate multipart upload: %v", err)
  34. return "", err
  35. }
  36. return v.UploadID, nil
  37. }
  38. func (c *MultiPartUploader) UploadPart(uploadID string, key string, partSize int64, partNumber int, stream io.Reader) (*types.UploadPartOutput, error) {
  39. resp, err := c.client.Object.UploadPart(
  40. context.Background(), key, uploadID, partNumber, stream, nil,
  41. )
  42. if err != nil {
  43. return nil, fmt.Errorf("failed to upload part: %w", err)
  44. }
  45. result := &types.UploadPartOutput{
  46. ETag: resp.Header.Get("ETag"),
  47. PartNumber: partNumber,
  48. }
  49. return result, nil
  50. }
  51. func (c *MultiPartUploader) CompleteMultipartUpload(uploadID string, key string, parts []*types.UploadPartOutput) error {
  52. opt := &cos.CompleteMultipartUploadOptions{}
  53. for i := 0; i < len(parts); i++ {
  54. opt.Parts = append(opt.Parts, cos.Object{
  55. PartNumber: parts[i].PartNumber, ETag: parts[i].ETag},
  56. )
  57. }
  58. _, _, err := c.client.Object.CompleteMultipartUpload(
  59. context.Background(), key, uploadID, opt,
  60. )
  61. if err != nil {
  62. return err
  63. }
  64. return nil
  65. }
  66. func (c *MultiPartUploader) AbortMultipartUpload() {
  67. }
  68. func (c *MultiPartUploader) Close() {
  69. }

本项目旨在将云际存储公共基础设施化,使个人及企业可低门槛使用高效的云际存储服务(安装开箱即用云际存储客户端即可,无需关注其他组件的部署),同时支持用户灵活便捷定制云际存储的功能细节。