package obs import ( "fmt" "io" "github.com/huaweicloud/huaweicloud-sdk-go-obs/obs" log "gitlink.org.cn/cloudream/common/pkgs/logger" cdssdk "gitlink.org.cn/cloudream/common/sdks/storage" "gitlink.org.cn/cloudream/storage/common/pkgs/storage/types" ) type MultiPartUploader struct { client *obs.ObsClient bucket string } func NewMultiPartUpload(address *cdssdk.OBSType) *MultiPartUploader { client, err := obs.New(address.AK, address.SK, address.Endpoint) if err != nil { log.Fatalf("Error: %v", err) } return &MultiPartUploader{ client: client, bucket: address.Bucket, } } func (c *MultiPartUploader) Initiate(objectName string) (string, error) { input := &obs.InitiateMultipartUploadInput{} input.Bucket = c.bucket input.Key = objectName imur, err := c.client.InitiateMultipartUpload(input) if err != nil { return "", fmt.Errorf("failed to initiate multipart upload: %w", err) } return imur.UploadId, nil } func (c *MultiPartUploader) UploadPart(uploadID string, key string, partSize int64, partNumber int, stream io.Reader) (*types.UploadedPartInfo, error) { uploadParam := &obs.UploadPartInput{ Bucket: c.bucket, Key: key, UploadId: uploadID, PartSize: partSize, PartNumber: partNumber, Body: stream, } part, err := c.client.UploadPart(uploadParam) if err != nil { return nil, fmt.Errorf("failed to upload part: %w", err) } result := &types.UploadedPartInfo{ ETag: part.ETag, PartNumber: partNumber, } return result, nil } func (c *MultiPartUploader) Complete(uploadID string, Key string, parts []*types.UploadedPartInfo) error { var uploadPart []obs.Part for i := 0; i < len(parts); i++ { uploadPart = append(uploadPart, obs.Part{ PartNumber: parts[i].PartNumber, ETag: parts[i].ETag, }) } notifyParam := &obs.CompleteMultipartUploadInput{ Bucket: c.bucket, Key: Key, UploadId: uploadID, Parts: uploadPart, } _, err := c.client.CompleteMultipartUpload(notifyParam) if err != nil { return err } return nil } func (c *MultiPartUploader) Abort() { } func (c *MultiPartUploader) Close() { }