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.0 kB

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

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