根据aws go-v2模块中提供的变更量,我们可以使用它们所拥有的看见。
禁用使用内容编码: gzip元数据头获取S3对象的自动解压缩。
他们还说,您应该使用aws/smithy- go的"SetHeaderValue“或"AddHeaderValue":
如果希望客户端发送Accept-Encoding: gzip请求标头,可以使用SetHeaderValue将此头添加到API操作方法调用中。中间件助手。
但是,使用这两种方法似乎不会导致下载的文件在从S3下载时解压缩gzip'd文件。下面的示例显示了我的代码,它目前下载压缩文件,尽管使用AWS建议的SetHeaderValue方法。
package main
import (
"context"
"fmt"
"os"
"github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/feature/s3/manager"
"github.com/aws/aws-sdk-go-v2/service/s3"
"github.com/aws/smithy-go/middleware"
"github.com/aws/smithy-go/transport/http"
)
func main() {
ctx := context.Background()
cfg, err := config.LoadDefaultConfig(ctx)
if err != nil {
panic(err)
}
// Here I attempt to set the header at the client level
client := s3.NewFromConfig(cfg, s3.WithAPIOptions(http.SetHeaderValue("Accept-Encoding", "gzip")))
downloader := manager.NewDownloader(client, func(d *manager.Downloader) {
d.Concurrency = 1
})
fdst, err := os.Create("decompressed.txt")
if err != nil {
panic(err)
}
bucket := "bucket"
key := "test6.gz"
n, err := downloader.Download(ctx, fdst,
&s3.GetObjectInput{Bucket: &bucket, Key: &key},
// Here I attempt to set the header on a per-call basis
manager.WithDownloaderClientOptions(
func(o *s3.Options) {
o.APIOptions = append(o.APIOptions, []func(*middleware.Stack) error{
http.SetHeaderValue("Accept-Encoding", "gzip"),
}...)
},
),
)
if err != nil {
panic(err)
}
fmt.Println(n)
}所以我的问题是,当gzip文件下载时,如何使它真正解压缩?理想情况下,我希望在每次调用的基础上控制标头,更改客户端的报头就不太有用了。
发布于 2022-10-18 17:58:52
downloader.Download需要一个io.WriterAt。因此,基本上,这个问题(在go中实现io.WriterAt的缓冲区)中的所有内容都可以将下载放到内存中,您可以在其中解压缩它。
https://stackoverflow.com/questions/74114973
复制相似问题