使用aws-sdk-go-v2 s3下载器时,如果不先将压缩文件写入磁盘,如何解压缩gzip文件



根据aws-sdk-go-v2模块中提供的更改日志,我们可以看到他们有

禁用[d]自动解压缩获取具有Content-Encoding:gzip元数据标头的AmazonS3对象。

他们接着说,你应该使用aws/smithy go的"SetHeaderValue";或";AddHeaderValue":

如果您希望客户端发送Accept-Encoding:gzip请求标头,您可以使用SetHeaderValue将此标头添加到API操作方法调用中。中间件助手。

然而,从S3下载时,使用这两种方法似乎都不会导致下载的文件解压缩gzip文件。下面的例子显示了我的代码,尽管使用了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文件下载时,我如何才能真正解压缩它?理想情况下,我希望在每次调用的基础上控制标头,更改客户端的标头用处不大。

downloader.Download取一个io.WriterAt。因此,从这个问题(Buffer在go中实现io.WriterAt(开始,基本上所有的东西都可以将下载内容解压到内存中

相关内容

  • 没有找到相关文章

最新更新