首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在不首先将压缩文件写入磁盘的情况下,如何使用aws-sdk-go-v2 s3下载程序来解压缩gzip文件?

在不首先将压缩文件写入磁盘的情况下,如何使用aws-sdk-go-v2 s3下载程序来解压缩gzip文件?
EN

Stack Overflow用户
提问于 2022-10-18 17:18:39
回答 1查看 104关注 0票数 1

根据aws go-v2模块中提供的变更量,我们可以使用它们所拥有的看见

禁用使用内容编码: gzip元数据头获取S3对象的自动解压缩。

他们还说,您应该使用aws/smithy- go的"SetHeaderValue“或"AddHeaderValue":

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

但是,使用这两种方法似乎不会导致下载的文件在从S3下载时解压缩gzip'd文件。下面的示例显示了我的代码,它目前下载压缩文件,尽管使用AWS建议的SetHeaderValue方法。

代码语言:javascript
复制
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文件下载时,如何使它真正解压缩?理想情况下,我希望在每次调用的基础上控制标头,更改客户端的报头就不太有用了。

EN

回答 1

Stack Overflow用户

发布于 2022-10-18 17:58:52

downloader.Download需要一个io.WriterAt。因此,基本上,这个问题(在go中实现io.WriterAt的缓冲区)中的所有内容都可以将下载放到内存中,您可以在其中解压缩它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74114973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档