You need to enable JavaScript to run this app.
Torch Object Storage

Torch Object Storage

Copy page
Download PDF
Copy Object
Resumable Copy (Go SDK)
Copy page
Download PDF
Resumable Copy (Go SDK)
Using the TOS Go SDK, resumable copy is suitable for scenarios where large objects are copied within a single bucket or between two buckets in the same region. The TOS Go SDK provides a resumable copy feature. By utilizing a local CheckPoint mechanism to record successfully copied segments, the SDK enables interrupted segment copy operations—caused by network failures or machine malfunctions—to be resumed by invoking the same interface again. Resumable copy divides the object to be copied into multiple segments and supports concurrent copying. After all segments have been copied, they are merged into a complete file. You can configure parameters such as the segment size for resumable copy, the number of threads for copying segments, and event callback functions. It is also possible to cancel the task during the execution of the breakpoint resume copy task.​
Precautions​
  • Copying files does not support cross-region bucket-to-bucket copying.​
  • When copying an object, the account must have read permission for the source object and write permission for the destination bucket.​
  • When copying an object, you may retain all metadata (default) or specify new metadata. However, the ACL was not retained; instead, it was set to private.​
Resumable Copy​
The following code implements resumable copy of the srcBucketName bucket's srcObjectKey object to the dstBucketName bucket, sets the object name to dstObjectKey, and supports retrying download upon failure. If a network timeout error is returned during the copy process, invoke ResumableCopyObject with the same parameters to resume the copy operation from the breakpoint.​
​
package main​
​
import (​
"context"​
"fmt"​
​
"github.com/volcengine/ve-tos-golang-sdk/v2/tos"​
)​
​
func checkErr(err error) {​
if err != nil {​
if serverErr, ok := err.(*tos.TosServerError); ok {​
fmt.Println("Error:", serverErr.Error())​
fmt.Println("Request ID:", serverErr.RequestID)​
fmt.Println("Response Status Code:", serverErr.StatusCode)​
fmt.Println("Response Header:", serverErr.Header)​
fmt.Println("Response Err Code:", serverErr.Code)​
fmt.Println("Response Err Msg:", serverErr.Message)​
} else {​
fmt.Println("Error:", err)​
}​
panic(err)​
}​
}​
​
func main() {​
var (​
accessKey = os.Getenv("TOS_ACCESS_KEY")​
secretKey = os.Getenv("TOS_SECRET_KEY")​
​
endpoint = "https://tos-cn-beijing.volces.com"​
region = "cn-beijing"​
​
srcBucketName = "*** Provide your src bucket name ***"​
dstBucketName = "*** Provide your dst bucket name ***"​
​
srcObjectKey = "srcObjectKey"​
dstObjectKey = "dstObjectKey"​
checkPointFilePath = "./example.checkpoint"​
ctx = context.Background()​
)​
​
client, err := tos.NewClientV2(endpoint, tos.WithRegion(region), tos.WithCredentials(tos.NewStaticCredentials(accessKey, secretKey)))​
checkErr(err)​
input := &tos.ResumableCopyObjectInput{​
CreateMultipartUploadV2Input: tos.CreateMultipartUploadV2Input{​
Bucket: dstBucketName,​
Key: dstObjectKey,​
},​
SrcBucket: srcBucketName,​
SrcKey: srcObjectKey,​
PartSize: 20 * 1024 * 1024,​
TaskNum: 3,​
EnableCheckpoint: true,​
CheckpointFile: checkPointFilePath,​
}​
output, err := client.ResumableCopyObject(ctx, input)​
checkErr(err)​
​
fmt.Println("ResumableCopyObject Request Bucket:", output.Bucket)​
fmt.Println("ResumableCopyObject Request Key:", output.Key)​
fmt.Println("ResumableCopyObject Request UploadID:", output.UploadID)​
fmt.Println("ResumableCopyObject Request Etag:", output.Etag)​
fmt.Println("ResumableCopyObject Request Location:", output.Location)​
fmt.Println("ResumableCopyObject Request VersionID:", output.VersionID)​
fmt.Println("ResumableCopyObject Request HashCrc64ecma:", output.HashCrc64ecma)​
}​
​
Handling Event Callbacks​
The following code is used to define a custom resumable copy callback function.​
​
package main​
​
import (​
"context"​
"fmt"​
​
"github.com/volcengine/ve-tos-golang-sdk/v2/tos"​
"github.com/volcengine/ve-tos-golang-sdk/v2/tos/enum"​
)​
​
// 自定义事件监听,需要实现 tos.CopyEventListener 接口​
type eventChange struct {​
}​
​
func (e eventChange) EventChange(event *tos.CopyEvent) {​
switch event.Type {​
case enum.CopyEventCreateMultipartUploadSucceed:​
fmt.Println("Resume Create Multipart Upload Success.\n ")​
case enum.CopyEventCreateMultipartUploadFailed:​
fmt.Println("Resume Create Multipart Upload Fail.\n ")​
case enum.CopyEventUploadPartCopySuccess:​
fmt.Printf("Copy %s %s part success, CopyPartInfo:%v\n", event.Bucket, event.Key, event.CopyPartInfo)​
case enum.CopyEventUploadPartCopyFailed:​
fmt.Printf("Copy %s %s part aborted.\n", event.Bucket, event.Key)​
case enum.CopyEventUploadPartCopyAborted:​
fmt.Printf("Copy %s %s part fail, err:%v\n", event.Bucket, event.Key, event.Err)​
case enum.CopyEventCompleteMultipartUploadSucceed:​
fmt.Printf("Copy %s %s success.\n", event.Bucket, event.Key)​
case enum.CopyEventCompleteMultipartUploadFailed:​
fmt.Printf("Copy %s %s fail,err:%v\n", event.Bucket, event.Key, event.Err)​
​
}​
}​
​
func checkErr(err error) {​
if err != nil {​
if serverErr, ok := err.(*tos.TosServerError); ok {​
fmt.Println("Error:", serverErr.Error())​
fmt.Println("Request ID:", serverErr.RequestID)​
fmt.Println("Response Status Code:", serverErr.StatusCode)​
fmt.Println("Response Header:", serverErr.Header)​
fmt.Println("Response Err Code:", serverErr.Code)​
fmt.Println("Response Err Msg:", serverErr.Message)​
} else {​
fmt.Println("Error:", err)​
}​
panic(err)​
}​
}​
​
func main() {​
var (​
accessKey = os.Getenv("TOS_ACCESS_KEY")​
secretKey = os.Getenv("TOS_SECRET_KEY")​
// Bucket 对于的 Endpoint,以华北2(北京)为例:https://tos-cn-beijing.volces.com​
endpoint = "https://tos-cn-beijing.volces.com"​
region = "cn-beijing"​
// 填写 BucketName​
srcBucketName = "*** Provide your src bucket name ***"​
dstBucketName = "*** Provide your dst bucket name ***"​
​
srcObjectKey = "srcObjectKey"​
dstObjectKey = "dstObjectKey"​
checkPointFilePath = "./example.checkpoint"​
ctx = context.Background()​
)​
// 初始化客户端​
client, err := tos.NewClientV2(endpoint, tos.WithRegion(region), tos.WithCredentials(tos.NewStaticCredentials(accessKey, secretKey)))​
checkErr(err)​
input := &tos.ResumableCopyObjectInput{​
CreateMultipartUploadV2Input: tos.CreateMultipartUploadV2Input{​
Bucket: dstBucketName,​
Key: dstObjectKey,​
},​
SrcBucket: srcBucketName,​
SrcKey: srcObjectKey,​
PartSize: 20 * 1024 * 1024,​
TaskNum: 3,​
EnableCheckpoint: true,​
CheckpointFile: checkPointFilePath,​
CopyEventListener: eventChange{},​
}​
output, err := client.ResumableCopyObject(ctx, input)​
checkErr(err)​
// 上传结果相关信息​
fmt.Println("ResumableCopyObject Request Bucket:", output.Bucket)​
fmt.Println("ResumableCopyObject Request Key:", output.Key)​
fmt.Println("ResumableCopyObject Request UploadID:", output.UploadID)​
fmt.Println("ResumableCopyObject Request Etag:", output.Etag)​
fmt.Println("ResumableCopyObject Request Location:", output.Location)​
fmt.Println("ResumableCopyObject Request VersionID:", output.VersionID)​
fmt.Println("ResumableCopyObject Request HashCrc64ecma:", output.HashCrc64ecma)​
}​
​
Cancellation Mechanism​
The following code is used to pause or cancel a resumable copy task.​
​
package main​
​
import (​
"context"​
"fmt"​
​
"github.com/volcengine/ve-tos-golang-sdk/v2/tos"​
)​
​
func checkErr(err error) {​
if err != nil {​
if serverErr, ok := err.(*tos.TosServerError); ok {​
fmt.Println("Error:", serverErr.Error())​
fmt.Println("Request ID:", serverErr.RequestID)​
fmt.Println("Response Status Code:", serverErr.StatusCode)​
fmt.Println("Response Header:", serverErr.Header)​
fmt.Println("Response Err Code:", serverErr.Code)​
fmt.Println("Response Err Msg:", serverErr.Message)​
} else {​
fmt.Println("Error:", err)​
}​
panic(err)​
}​
}​
​
func main() {​
var (​
accessKey = os.Getenv("TOS_ACCESS_KEY")​
secretKey = os.Getenv("TOS_SECRET_KEY")​
// Bucket 对于的 Endpoint,以华北2(北京)为例:https://tos-cn-beijing.volces.com​
endpoint = "https://tos-cn-beijing.volces.com"​
region = "cn-beijing"​
// 填写 BucketName​
srcBucketName = "*** Provide your src bucket name ***"​
dstBucketName = "*** Provide your dst bucket name ***"​
​
srcObjectKey = "srcObjectKey"​
dstObjectKey = "dstObjectKey"​
checkPointFilePath = "./example.checkpoint"​
ctx = context.Background()​
)​
// 初始化客户端​
client, err := tos.NewClientV2(endpoint, tos.WithRegion(region), tos.WithCredentials(tos.NewStaticCredentials(accessKey, secretKey)))​
checkErr(err)​
// 使用 cancel() 实现对任务的取消​
cancel := tos.NewCancelHook()​
input := &tos.ResumableCopyObjectInput{​
CreateMultipartUploadV2Input: tos.CreateMultipartUploadV2Input{​
Bucket: dstBucketName,​
Key: dstObjectKey,​
},​
SrcBucket: srcBucketName,​
SrcKey: srcObjectKey,​
PartSize: 20 * 1024 * 1024,​
TaskNum: 3,​
EnableCheckpoint: true,​
CheckpointFile: checkPointFilePath,​
CancelHook: cancel,​
}​
output, err := client.ResumableCopyObject(ctx, input)​
checkErr(err)​
// 上传结果相关信息​
fmt.Println("ResumableCopyObject Request Bucket:", output.Bucket)​
fmt.Println("ResumableCopyObject Request Key:", output.Key)​
fmt.Println("ResumableCopyObject Request UploadID:", output.UploadID)​
fmt.Println("ResumableCopyObject Request Etag:", output.Etag)​
fmt.Println("ResumableCopyObject Request Location:", output.Location)​
fmt.Println("ResumableCopyObject Request VersionID:", output.VersionID)​
fmt.Println("ResumableCopyObject Request HashCrc64ecma:", output.HashCrc64ecma)​
}​
​
​
Last updated: 2025.09.19 17:30:22