在上传大文件(超过5 GB)到OSS的过程中,如果出现网络中断、程序异常退出等问题导致文件上传失败,甚至重试多次仍无法完成上传,您需要使用断点续传上传的方式。断点续传上传将需要上传的大文件分成多个较小的分片并发上传,加速上传完成时间。如果上传过程中,某一分片上传失败,再次上传时会从Checkpoint文件记录的断点继续上传,无需重新上传所有分片。上传完成后,所有分片将合并成完整的文件。
注意事项
- 本文以华东1(杭州)外网Endpoint为例。如果您希望通过与OSS同地域的其他阿里云产品访问OSS,请使用内网Endpoint。关于OSS支持的Region与Endpoint的对应关系,请参见访问域名和数据中心。
-
本文以从环境变量读取访问凭证为例。如何配置访问凭证,请参见Go配置访问凭证。
- 本文以OSS域名新建OSSClient为例。如果您希望通过自定义域名、STS等方式新建OSSClient,请参见Go初始化。
-
要断点续传上传,您必须有
oss:PutObject
权限。具体操作,请参见为RAM用户授权自定义的权限策略。 -
SDK会将上传的状态信息记录在Checkpoint文件中,所以要确保程序对Checkpoint文件有写权限。
-
请勿修改Checkpoint文件中携带的校验信息。如果Checkpoint文件损坏,则会重新上传所有分片。
-
如果上传过程中本地文件发生了改变,则会重新上传所有分片。
实现方法
您可以使用Bucket.UploadFile方法实现断点续传上传。可设置的参数及选项如下:
参数 |
说明 |
objectKey |
上传到OSS的文件名称,等同于objectName。 |
filePath |
待上传的本地文件路径。 |
partSize |
上传的分片大小,取值范围为100 KB~5 GB。默认值为100 KB。 |
options |
包含如下可选项:
说明 更多信息,请参见设置文件元信息。 |
示例代码
以下代码用于断点续传上传。
package main
import (
"fmt"
"os"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 创建OSSClient实例。
// yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 填写Bucket名称,例如examplebucket。
bucket, err := client.Bucket("examplebucket")
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 通过UploadFile实现断点续传上传时,限制分片数量不能超过10000。
// 您需要结合上传文件的大小,合理设置每个分片的大小。每个分片大小的取值范围为100 KB~5 GB。默认值为100 KB(即100*1024)。
// 通过oss.Routines指定分片上传并发数为3。
// yourObjectName填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。
// yourLocalFile填写本地文件的完整路径,例如D:\localpath\examplefile.txt。如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件。
err = bucket.UploadFile("exampledir/exampleobject.txt", "D:\localpath\examplefile.txt", 100*1024, oss.Routines(3), oss.Checkpoint(true, ""))
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
}
常见问题
断点续传上传时报错Too many parts, Please increase part size.
怎么办?
报错原因是分片数量超出限制。您需要适当增加每个分片的大小,确保文件总大小除以每个分片大小的值小于10000。其中,每个分片大小的取值范围为100 KB~5 GB。
相关文档
关于断点续传上传的完整示例代码,请参见GitHub示例。
内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家
阿里云企业补贴进行中: 马上申请
腾讯云限时活动1折起,即将结束: 马上收藏
同尘科技为腾讯云授权服务中心。
购买腾讯云产品享受折上折,更有现金返利:同意关联,立享优惠
转转请注明出处:https://www.yunxiaoer.com/157043.html