1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
|
package sample
import (
"bytes"
"fmt"
"io"
"io/ioutil"
"os"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
// GetObjectSample 展示了流式下载、范围下载、断点续传下载的用法
func GetObjectSample() {
// 创建Bucket
bucket, err := GetTestBucket(bucketName)
if err != nil {
HandleError(err)
}
// 上传对象
err = bucket.PutObjectFromFile(objectKey, localFile)
if err != nil {
HandleError(err)
}
// 场景1:下载object存储到ReadCloser,注意需要Close。
body, err := bucket.GetObject(objectKey)
if err != nil {
HandleError(err)
}
data, err := ioutil.ReadAll(body)
body.Close()
if err != nil {
HandleError(err)
}
data = data // use data
// 场景2:下载object存储到bytes数组,适合小对象。
buf := new(bytes.Buffer)
body, err = bucket.GetObject(objectKey)
if err != nil {
HandleError(err)
}
io.Copy(buf, body)
body.Close()
// 场景3:下载object存储到本地文件,用户打开文件传入句柄。
fd, err := os.OpenFile("mynewfile-1.jpg", os.O_WRONLY|os.O_CREATE, 0660)
if err != nil {
HandleError(err)
}
defer fd.Close()
body, err = bucket.GetObject(objectKey)
if err != nil {
HandleError(err)
}
io.Copy(fd, body)
body.Close()
// 场景4:下载object存储到本地文件。
err = bucket.GetObjectToFile(objectKey, "mynewfile-2.jpg")
if err != nil {
HandleError(err)
}
// 场景5:满足约束条件下载,否则返回错误。GetObject/GetObjectToFile/DownloadFile都支持该功能。
// 修改时间,约束条件满足,执行下载。
body, err = bucket.GetObject(objectKey, oss.IfModifiedSince(pastDate))
if err != nil {
HandleError(err)
}
body.Close()
// 修改时间,约束条件不满足,不执行下载。
_, err = bucket.GetObject(objectKey, oss.IfUnmodifiedSince(pastDate))
if err == nil {
HandleError(err)
}
meta, err := bucket.GetObjectDetailedMeta(objectKey)
if err != nil {
HandleError(err)
}
etag := meta.Get(oss.HTTPHeaderEtag)
// 校验内容,约束条件满足,执行下载。
body, err = bucket.GetObject(objectKey, oss.IfMatch(etag))
if err != nil {
HandleError(err)
}
body.Close()
// 校验内容,约束条件不满足,不执行下载。
body, err = bucket.GetObject(objectKey, oss.IfNoneMatch(etag))
if err == nil {
HandleError(err)
}
// 场景6:大文件分片下载,支持并发下载,断点续传功能。
// 分片下载,分片大小为100K。默认使用不使用并发下载,不使用断点续传。
err = bucket.DownloadFile(objectKey, "mynewfile-3.jpg", 100*1024)
if err != nil {
HandleError(err)
}
// 分片大小为100K,3个协程并发下载。
err = bucket.DownloadFile(objectKey, "mynewfile-3.jpg", 100*1024, oss.Routines(3))
if err != nil {
HandleError(err)
}
// 分片大小为100K,3个协程并发下载,使用断点续传下载文件。
err = bucket.DownloadFile(objectKey, "mynewfile-3.jpg", 100*1024, oss.Routines(3), oss.Checkpoint(true, ""))
if err != nil {
HandleError(err)
}
// 断点续传功能需要使用本地文件,记录哪些分片已经下载。该文件路径可以Checkpoint的第二个参数指定,如果为空,则为下载文件目录。
err = bucket.DownloadFile(objectKey, "mynewfile-3.jpg", 100*1024, oss.Checkpoint(true, "mynewfile.cp"))
if err != nil {
HandleError(err)
}
// 场景7:内容进行 GZIP压缩传输的用户。GetObject/GetObjectToFile具有相同功能。
err = bucket.PutObjectFromFile(objectKey, htmlLocalFile)
if err != nil {
HandleError(err)
}
err = bucket.GetObjectToFile(objectKey, "myhtml.gzip", oss.AcceptEncoding("gzip"))
if err != nil {
HandleError(err)
}
// 删除object和bucket
err = DeleteTestBucketAndObject(bucketName)
if err != nil {
HandleError(err)
}
fmt.Println("GetObjectSample completed")
}
|