傳輸管理器
文檔地址:傳送門
上傳和下載管理器可以分解大型對象,以便可以將它們分成多個部分并行傳輸。這使得恢復中斷的傳輸變得容易。
下載管理器
S3 下載管理器確定文件是否可以拆分為更小的部分并并行下載。您可以自定義并行下載的數(shù)量和下載部分的大小。
上傳管理器
S3 上傳管理器確定文件是否可以拆分為更小的部分并并行上傳。您可以自定義并行上傳的數(shù)量和上傳部分的大小。
示例代碼
package main
import (
"fmt"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3"
"github.com/aws/aws-sdk-go/service/s3/s3manager"
"os"
)
var (
accessKey = "xxx" //""
secretKey = "xxx" //""
region = "oss-cn-beijing"
endpoint = "oss-cn-beijing.aliyuncs.com"
)
func main() {
//只要不修改session,session就可以安全的并發(fā)使用。
sess, err := session.NewSession(&aws.Config{
Credentials: credentials.NewStaticCredentials(accessKey, secretKey, ""),
Endpoint: aws.String(endpoint),
Region: aws.String(region),
//minio:true,oss:false
S3ForcePathStyle: aws.Bool(false),
//SDK 支持使用客戶端 TLS 證書配置的環(huán)境和會話選項,這些證書作為客戶端 TLS 握手的一部分發(fā)送以進行客戶端身份驗證。
//如果使用,則需要 Cert 和 Key 值。如果缺少一個,或者無法加載文件的內(nèi)容,則會返回一個錯誤。
//ClientTLSCert: nil,
//ClientTLSKey: nil,
})
if err != nil {
panic(err)
}
svc := s3.New(sess)
//本地需要存在一個2.jpg文件
UploadWithClient(svc, "bkt-bj1", "2.jpg")
DownloadWithClient(svc, "bkt-bj1", "2.jpg")
}
//https://docs.aws.amazon.com/zh_cn/sdk-for-go/v1/developer-guide/sdk-utilities.html
//傳輸管理器 上傳和下載管理器可以分解大型對象,以便可以將它們分成多個部分并行傳輸。這使得恢復中斷的傳輸變得容易。
//S3 下載管理器確定文件是否可以拆分為更小的部分并并行下載。您可以自定義并行下載的數(shù)量和下載部分的大小。
func DownloadWithClient(svc *s3.S3, bucket, key string) {
download := s3manager.NewDownloaderWithClient(svc, func(d *s3manager.Downloader) {
d.PartSize = 64 * 1024 * 1024 // 64MB per part
//d.BufferProvider = s3manager.NewPooledBufferedWriterReadFromProvider(25 * 1024 * 1024)
})
f, err := os.Create("d_" + key)
if err != nil {
panic(err)
}
defer f.Close()
n, err := download.Download(f, &s3.GetObjectInput{
Bucket: aws.String(bucket),
Key: aws.String(key),
})
if err != nil {
panic(err)
}
fmt.Printf("Download.n:%d\n", n)
}
//S3 上傳管理器確定文件是否可以拆分為更小的部分并并行上傳。您可以自定義并行上傳的數(shù)量和上傳部分的大小。
func UploadWithClient(svc *s3.S3, bucket, key string) {
uploader := s3manager.NewUploaderWithClient(svc, func(u *s3manager.Uploader) {
定義將在內(nèi)存中緩沖25個MiB的策略
//u.BufferProvider = s3manager.NewBufferedReadSeekerWriteToPool(25 * 1024 * 1024)
//指定要上傳的每個部分的緩沖區(qū)大?。ㄒ宰止?jié)為單位)。每個部分的最小大小為 5 MB。 DefaultUploadPartSize
u.PartSize = 64 * 1024 * 1024 // 每個部分 64MB
// 指定要并行上傳的part數(shù)量。 默認為5
u.Concurrency = s3manager.DefaultUploadConcurrency
})
fOpen, err := os.Open(key)
if err != nil {
panic(err)
}
uploadOutput, err := uploader.Upload(&s3manager.UploadInput{
Body: fOpen,
Bucket: aws.String(bucket),
Key: aws.String(key),
})
if err != nil {
if multierr, ok := err.(s3manager.MultiUploadFailure); ok {
// Process error and its associated uploadID
fmt.Println("Error:", multierr.Code(), multierr.Message(), multierr.UploadID())
} else {
// Process error generically
fmt.Println("Error:", err.Error())
}
return
}
fmt.Printf("UploadID:%s\n", uploadOutput.UploadID)
fmt.Printf("ETag:%s\n", *uploadOutput.ETag)
fmt.Printf("Location:%s\n", uploadOutput.Location)
}
輸出結(jié)果文章來源:http://www.zghlxwxcb.cn/news/detail-607443.html
UploadID:
ETag:"43325E9E80CDF868045A4ADD7893B935"
Location:https://bkt-bj1.oss-cn-beijing.aliyuncs.com/2.jpg
Download.n:147526
下載的文件:d_2.jpg如圖文章來源地址http://www.zghlxwxcb.cn/news/detail-607443.html
到了這里,關(guān)于5、AWS SDK for Go-使用s3manager上傳下載文件的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!