OSS Go SDK提供了丰富的文件下载接口,用户可以通过以下方式从OSS中下载文件:
提示:
- 下载的示例代码在
sample/get_object.go。
import (
"fmt"
"io/ioutil"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
client, err := oss.New("Endpoint", "AccessKeyId", "AccessKeySecret")
if err != nil {
// HandleError(err)
}
bucket, err := client.Bucket("my-bucket")
if err != nil {
// HandleError(err)
}
body, err := bucket.GetObject("my-object")
if err != nil {
// HandleError(err)
}
data, err := ioutil.ReadAll(body)
if err != nil {
// HandleError(err)
}
body.Close()
fmt.Println("data:", string(data))
注意:
- io.ReadCloser数据读取完毕后,需要调用Close关闭。
import (
"bytes"
"io"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
client, err := oss.New("Endpoint", "AccessKeyId", "AccessKeySecret")
if err != nil {
// HandleError(err)
}
bucket, err := client.Bucket("my-bucket")
if err != nil {
// HandleError(err)
}
body, err := bucket.GetObject("my-object")
if err != nil {
// HandleError(err)
}
buf := new(bytes.Buffer)
io.Copy(buf, body)
body.Close()
import (
"io"
"os"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
client, err := oss.New("Endpoint", "AccessKeyId", "AccessKeySecret")
if err != nil {
// HandleError(err)
}
bucket, err := client.Bucket("my-bucket")
if err != nil {
// HandleError(err)
}
body, err := bucket.GetObject("my-object")
if err != nil {
// HandleError(err)
}
defer body.Close()
fd, err := os.OpenFile("LocalFile", os.O_WRONLY|os.O_CREATE, 0660)
if err != nil {
// HandleError(err)
}
defer fd.Close()
io.Copy(fd, body)
import "github.com/aliyun/aliyun-oss-go-sdk/oss"
client, err := oss.New("Endpoint", "AccessKeyId", "AccessKeySecret")
if err != nil {
// HandleError(err)
}
bucket, err := client.Bucket("my-bucket")
if err != nil {
// HandleError(err)
}
err = bucket.GetObjectToFile("my-object", "LocalFile")
if err != nil {
// HandleError(err)
}
当下载大文件时,如果网络不稳定或者程序崩溃了,则整个下载就失败了。用户
不得不重头再来,这样做不仅浪费资源,在网络不稳定的情况下,往往重试多次
还是无法完成下载。
通过Bucket.DownloadFile接口来实现断点续传下载。它有以下参数:
file.cpt,其中file是本地文件的名字指定限定条件下载其实现的原理是将要下载的Object分成若干个分片分别下载,最后所有分片都下 载成功后,完成整个文件的下载。在下载的过程中会记录当前下载的进度信息 (记录在checkpoint文件中)和已下载的分片,如果下载过程中某一分片下载失败,再次下 载时会从checkpoint文件中记录的点继续下载。这要求再次调用时要指定与上次 相同的checkpoint文件。下载完成后,checkpoint文件会被删除。
import "github.com/aliyun/aliyun-oss-go-sdk/oss"
client, err := oss.New("Endpoint", "AccessKeyId", "AccessKeySecret")
if err != nil {
// HandleError(err)
}
bucket, err := client.Bucket("my-bucket")
if err != nil {
// HandleError(err)
}
err = bucket.DownloadFile("my-object", "LocalFile", 100*1024, oss.Routines(3), oss.Checkpoint(true, ""))
if err != nil {
// HandleError(err)
}
注意:
- SDK会将下载的中间状态信息记录在cp文件中,所以要确保用户对cpt文 件有写权限
- cpt文件记录了下载的中间状态信息并自带了校验,用户不能去编辑它,如 果cpt文件损坏则重新下载文件
- 如果下载过程中待下载的Object发生了改变(ETag改变),或者part文件丢 失或被修改,则重新下载文件
提示:
- 指定断点续传checkpoint文件路径使用
oss.Checkpoint(true, "your-cp-file.cp")- 使用
bucket.DownloadFile(objectKey, localFile, 100*1024),默认不使用分片并发下载、不启动断点续传
下载文件时,用户可以指定一个或多个限定条件,所有的限定条件都满足时下载,不满足时报错不下载文件。 可以使用的限定条件如下:
| 参数 | 说明 |
|---|---|
| IfModifiedSince | 如果指定的时间早于实际修改时间,则正常传送。否则返回错误。 |
| IfUnmodifiedSince | 如果传入参数中的时间等于或者晚于文件实际修改时间,则正常传输文件;否则返回错误。 |
| IfMatch | 如果传入期望的ETag和object的 ETag匹配,则正常传输;否则返回错误。 |
| IfNoneMatch | 如果传入的ETag值和Object的ETag不匹配,则正常传输;否则返回错误。 |
import "time"
import "github.com/aliyun/aliyun-oss-go-sdk/oss"
client, err := oss.New("Endpoint", "AccessKeyId", "AccessKeySecret")
if err != nil {
// HandleError(err)
}
bucket, err := client.Bucket("my-bucket")
if err != nil {
// HandleError(err)
}
date := time.Date(2015, time.November, 10, 23, 0, 0, 0, time.UTC)
// 限定条件不满足,不下载文件
err = bucket.GetObjectToFile("my-object", "LocalFile", oss.IfModifiedSince(date))
if err == nil {
// HandleError(err)
}
// 满足限定条件,下载文件
err = bucket.GetObjectToFile("my-object", "LocalFile", oss.IfUnmodifiedSince(date))
if err != nil {
// HandleError(err)
}
提示:
- ETag的值可以通过Bucket.GetObjectDetailedMeta获取。
- Bucket.GetObject,Bucket.GetObjectToFile,Bucket.DownloadFile都支持限定条件。
文件可以压缩下载,目前支持GZIP压缩。Bucket.GetObject、Bucket.GetObjectToFile支持压缩功能。
import "github.com/aliyun/aliyun-oss-go-sdk/oss"
client, err := oss.New("Endpoint", "AccessKeyId", "AccessKeySecret")
if err != nil {
// HandleError(err)
}
bucket, err := client.Bucket("my-bucket")
if err != nil {
// HandleError(err)
}
err = bucket.GetObjectToFile("my-object.txt", "LocalFile.gzip", oss.AcceptEncoding("gzip"))
if err != nil {
// HandleError(err)
}