草庐IT

amazon-web-services - 读取一个文件,将其压缩并将压缩后的输出通过管道传输到 S3

coder 2023-07-02 原文

我正在尝试编写一个工具来压缩目录并将压缩的输出流式传输到 S3,而无需先将其缓存在磁盘上。

package main

import (
    "compress/gzip"
    "io"
    "log"
    "os"
    "sync"

    "github.com/rlmcpherson/s3gof3r"
)

// log.Fatal() implies os.Exit(1)
func logerror(err error) {
    if err != nil {
        log.Fatalf("%s\n", err)
    }
}

func main() {
    k, err := s3gof3r.EnvKeys()
    logerror(err)

    // Open bucket we want to write a file to
    s3 := s3gof3r.New("", k)
    bucket := s3.Bucket("somebucket")

    // Open file to upload
    files, err := os.Open("somefile")
    logerror(err)
    defer files.Close()

    // open a PutWriter for S3 upload
    s3writer, err := bucket.PutWriter("somezipfile.gz", nil, nil)
    logerror(err)

    // Create io pipe for passing gzip output to putwriter input
    pipereader, pipewriter := io.Pipe()
    defer pipereader.Close()

    var wg sync.WaitGroup
    wg.Add(2)

    // Compress
    go func() {
        defer wg.Done()
        defer pipewriter.Close()

        gw := gzip.NewWriter(pipewriter)
        defer gw.Close()

        _, err := io.Copy(gw, files)
        logerror(err)
    }()

    // Transmit
    go func() {
        defer wg.Done()

        _, err := io.Copy(s3writer, pipereader)
        logerror(err)
    }()

    wg.Wait()

}

当我编译并运行它时,没有错误输出,S3 中也没有文件。如果有帮助的话,添加一堆打印品可以得到以下输出:

files:  &{0xc4200d0a00}
s3writer:  &{{https  <nil> somebucket.s3.amazonaws.com /somezipfile.gz  false  } 0xc4200d0a60 0xc420014540 20971520 [] 0 0xc42010e2a0 0 false <nil> {{} [0 0 0 0 0 0 0 0 0 0 0 0] 0} 0xc42010e300 0xc42010e360  0xc42035a740 0 97wUYO2YZPjLXqOLTma_Y1ASo.0IdeoKkif6pch60s3._J1suo9pUTCFwUj23uT.puzzDEHcV1KJPze.1EnLeoNehhBXeSpsH_.e4gXlNqBZ0HFsvyABJfHNYwUyXASx { []} 0}
pipewriter:  &{0xc42013c180}
gzipwriter:  &{{ [] 0001-01-01 00:00:00 +0000 UTC  255} 0xc420116020 -1 false <nil> 0 0 false [0 0 0 0 0 0 0 0 0 0] <nil>}
archive:  1283
upload:  606

感谢帮助!

最佳答案

我最终通过另一个途径获得了一些帮助,工作代码:|

package s3upload

import (
    "compress/gzip"
    "io"
    "os"

    "github.com/crielly/mongosnap/logger"
    "github.com/rlmcpherson/s3gof3r"
)

// S3upload streams compressed output to S3
func S3upload(toarchive, s3bucket, object string) {
    keys, err := s3gof3r.EnvKeys()
    logger.LogError(err)

    // Open bucket we want to write a file to
    s3 := s3gof3r.New("", keys)
    bucket := s3.Bucket(s3bucket)

    // open a PutWriter for S3 upload
    s3writer, err := bucket.PutWriter(object, nil, nil)
    logger.LogError(err)
    defer s3writer.Close()

    // Open a compressed writer to handle gzip and pass it to S3 writer
    zipwriter := gzip.NewWriter(s3writer)
    defer zipwriter.Close()

    // Open files we want archived
    file, err := os.Open(toarchive)
    logger.LogError(err)
    defer file.Close()

    // Pass opened file to compression writer
    _, err = io.Copy(zipwriter, file)
    logger.LogError(err)

}

关于amazon-web-services - 读取一个文件,将其压缩并将压缩后的输出通过管道传输到 S3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42546677/

有关amazon-web-services - 读取一个文件,将其压缩并将压缩后的输出通过管道传输到 S3的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  3. Ruby 写入和读取对象到文件 - 2

    好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信

  4. ruby-on-rails - rails : save file from URL and save it to Amazon S3 - 2

    从给定URL下载文件并立即将其上传到AmazonS3的更直接的方法是什么(+将有关文件的一些信息保存到数据库中,例如名称、大小等)?现在,我既不使用Paperclip,也不使用Carrierwave。谢谢 最佳答案 简单明了:require'open-uri'require's3'amazon=S3::Service.new(access_key_id:'KEY',secret_access_key:'KEY')bucket=amazon.buckets.find('image_storage')url='http://www.ex

  5. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  6. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

    我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

  7. ruby-on-rails - s3_direct_upload 在生产服务器中不工作 - 2

    在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo

  8. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

  9. ruby - 如何使用 CarrierWave 从 S3 获取真实文件 - 2

    我有一个应用程序可以读取文件的内容并为其编制索引。我将它们存储在磁盘本身中,但现在我使用的是AmazonS3,因此以下方法不再适用。事情是这样的:defperform(docId)@document=Document.find(docId)if@document.file?#Youshould'tcreateanewversion@document.versionlessdo|doc|@document.file_content=Cloudoc::Extractor.new.extract(@document.file.file)@document.saveendendend@docu

  10. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

随机推荐