如何在S3中保存数据流? aws-sdk-go 示例不起作用?

2023-12-24

我正在尝试将给定的数据流持久保存到 S3 兼容存储中。 在流结束之前,大小是未知的,大小可能从 5MB 到 ~500GB 不等。

我尝试了不同的可能性,但没有找到比自己实现分片更好的解决方案。我最好的猜测是使用我的流填充固定大小的缓冲区并将其写入 S3。 有更好的解决方案吗?也许这是一种对我来说透明的方式,无需将整个流写入内存?

aws-sdk-go 自述文件有一个示例程序,它从 stdin 获取数据并将其写入 S3:https://github.com/aws/aws-sdk-go#using-the-go-sdk https://github.com/aws/aws-sdk-go#using-the-go-sdk

当我尝试用管道输入数据时|我收到以下错误: failed to upload object, SerializationError: failed to compute request body size caused by: seek /dev/stdin: illegal seek 我做错了什么或者这个例子没有像我预期的那样工作吗?

我虽然尝试过 minio-go,但PutObject() https://github.com/xxorde/minio-steam-to-s3/blob/018b08b15b35ce528abc9af621bef28490fff67e/main.go or client.PutObject Streaming() https://github.com/xxorde/minio-steam-to-s3/blob/e74829acddc8f8693efc54da2d8d086d1a5e8a3f/main.go。 这是可行的,但消耗的内存与要存储的数据一样多。

  1. 有更好的解决方案吗?
  2. 是否有一个小示例程序可以将任意数据传输到 S3 中?

你可以使用sdkUploader http://docs.aws.amazon.com/sdk-for-go/api/service/s3/s3manager/#Uploader处理未知大小的上传,但您需要os.Stdin通过将其包装成“不可查找”io.Reader。这是因为Uploader,虽然它只需要一个io.Reader作为输入主体,它在底层会检查输入主体是否也是一个Seeker如果是的话,它确实会调用Seek在上面。自从os.Stdin只是一个*os.File它实现了Seeker接口,默认情况下,你会得到与你得到的相同的错误PutObjectWithContext.

The Uploader还允许您以可配置大小的块的形式上传数据,并且还可以配置应同时上传的块的数量。

这是链接示例的修改版本,删除了可以保持不变的代码。

package main

import (
    // ...
    "io"
    "github.com/aws/aws-sdk-go/service/s3/s3manager"
)

type reader struct {
    r io.Reader
}

func (r *reader) Read(p []byte) (int, error) {
    return r.r.Read(p)
}

func main() {
    // ... parse flags

    sess := session.Must(session.NewSession())
    uploader := s3manager.NewUploader(sess, func(u *s3manager.Uploader) {
        u.PartSize = 20 << 20 // 20MB
        // ... more configuration
    })

    // ... context stuff

    _, err := uploader.UploadWithContext(ctx, &s3manager.UploadInput{
        Bucket: aws.String(bucket),
        Key:    aws.String(key),
        Body:   &reader{os.Stdin},
    })

    // ... handle error
}

至于这是否是一个比minio-go我不知道,你必须自己测试一下。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在S3中保存数据流? aws-sdk-go 示例不起作用? 的相关文章

随机推荐

  • Play 2.0 RESTful请求后处理

    关于这个问题 https stackoverflow com questions 11060761 how can my play 2 app respond to different accept headers from the cli
  • 没有模块命名常量

    我想用 Tastypie 框架做示例应用程序 我将 Tastypie 添加到已安装的应用程序并进行了修改urls py根据需要 添加from tastypie api import Api 但当我打开http localhost 8000
  • iPhone 应用程序中出现奇怪的不需要的动画

    我不想发布这个 但我在我正在开发的 iPhone 应用程序中看到了不需要的动画 我以前从未在我的应用程序或任何其他应用程序中见过这种情况 此应用程序仅适用于 iOS 4 2 和 iPhone 即使在 iPhone4 上也会发生这种奇怪的情况
  • 元组函数的 N 元版本

    是否有一个库具有 n 元版本的元组函数 例如first 等 通过 Template Haskell 或使用其他方法 理想情况下我想说 select 3 0 1 我们用它来表示 lambda x y z gt x y 对于一个通用的 对于功能
  • 如何在 Internet Explorer 中的全高表格中制作全高单元格

    我有下一个html代码 table style width 100 height 100 tr td td tr table
  • 我如何教 ProGuard 删除它保留但我不使用的东西?

    我有一个 Android 项目proguard rules pro文件为app模块仅包含以下内容 ProGuard rules dontobfuscate dontwarn android arch util paging CountedD
  • 获取特定格式日期的唯一 ID?

    我有可以生成随机唯一 ID 的代码 但是有没有办法可以编辑此代码 以便它以特定方式 如 yyyy mm dd 0001 获取日期 我希望每次单击generateid按钮时最后4位数字加1 所以它将更改为 0002 这是我当前的代码 有没有可
  • 如何在 Java 中识别/处理文本文件换行符?

    我从不同的系统获取不同格式的文件 我需要将它们导入到我们的数据库中 导入过程的一部分是检查行长度以确保格式正确 我们似乎在处理来自添加了一个字符的 UNIX 系统的文件时遇到了问题 我怀疑这是由于 UNIX 和 Windows 平台上的回车
  • Airflow:如何删除 DAG?

    我已经启动了 Airflow 网络服务器并安排了一些 dags 我可以在 Web GUI 上看到这些 dags 如何删除正在运行并在 Web GUI 中显示的特定 DAG 有 Airflow CLI 命令可以做到这一点吗 我环顾四周 但找不
  • 在 AMP 中运行 JavaScript

    我对 JavaScript 应该如何在 AMP 页面中运行感到有点困惑 据我了解 我的 JavaScript 必须在 iframe 中执行 此类 iframe 必须放置在页面下方 至少从顶部起 75 并且必须通过 https 提供服务 这确
  • std::runtime_error::runtime_error(const std::string&) 如何满足 std::Exception 对 throw() 的要求?

    std exception要求它的构造函数是throw Yet std runtime error接受一个std string作为它的参数 这表明它正在存储一个std string某处 因此 作业或复制构造必须在某个地方进行 而对于std
  • http.sslVerify=false 不会在 git config 中禁用 ssl 验证

    Issue 我一直在尝试通过来自企业 GitHub 服务器的 http 代理 在 git 全局配置中设置 从 Ubuntu AWS 实例克隆 git 存储库 从代理克隆可以工作 但是从实例克隆 通过代理 我收到以下错误 致命 无法访问 ht
  • 在 Visual Studio 中调试 JavaScript 时出现“没有为当前文档加载符号”

    我正在开发一个 NET 3 5 网站 一个解决方案下有三个项目 我在这个项目中使用 jQuery 我想使用 Visual Studio JavaScript 调试器来单步执行我的 JavaScript 代码 如果我在任何 js 文件中设置断
  • QLabel Qt/c++ 文本的渐变颜色

    我尝试为 QLabel 文本设置渐变颜色 我正在尝试使用 setStyleSheet 函数 但它不起作用 我阅读这篇文章 https www qtcentre org threads 32781 don t work qlineargrad
  • data.table join + update with mult='first' 给出了意想不到的结果

    在下面的示例中 我有一个用户表和一个事务表 其中一个用户可以有 0 个 1 个或多个事务 我执行连接 更新mult first 在 users 表上尝试插入一列 指示每个用户第一次发生事务的日期 library data table v1
  • 如何从 XLL UDF 返回数组

    我正在尝试使用 C API 为 Excel 编写一个数组构造函数作为工作表函数 Goal array cons 1 2 3 gt 1 2 3 但是 我没有正确初始化 XLOPER12 在 Excel 中 我的函数当前返回 NUM 我正在将参
  • 模块已经成功安装,但是导入时却找不到? - Python

    我正在尝试使用 graphviz Python 模块 但遇到了这个问题 我在命令提示符下安装了它 但它没有显示在 IPython 中 我还有一个 Python 3 5 32 位 解释器 它显示在其中 但我正在尝试弄清楚如何安装它 以便它在
  • 如何找出 Instruments 中保留对象的内容?

    我最近将我的 iOS 项目转换为 ARC 视图控制器之一没有调用其 dealloc 方法 并且没有根据 Instruments 进行释放 我已经仔细检查了我的所有属性并将适当的属性设置为弱 我还确保任何将视图控制器作为委托的东西都在 vie
  • ZLIB 解压 - 客户端

    我正在以 ZLIB 压缩输入流 使用 Javascript Ajax JQuery 我需要在客户端解压缩它 有办法这样做吗 我已经在 J AVA 中工作了 如下所示 但需要在客户端执行此操作 url new URL getCodeBase
  • 如何在S3中保存数据流? aws-sdk-go 示例不起作用?

    我正在尝试将给定的数据流持久保存到 S3 兼容存储中 在流结束之前 大小是未知的 大小可能从 5MB 到 500GB 不等 我尝试了不同的可能性 但没有找到比自己实现分片更好的解决方案 我最好的猜测是使用我的流填充固定大小的缓冲区并将其写入