如何将从 S3 使用 Rusoto 下载的文件保存到我的硬盘?

2023-11-30

我正在尝试使用 Rusoto 从存储桶下载文件,并获取文件内容:

fn get_object(client: &TestClient, bucket: &str, filename: &str) {
    let get_req = GetObjectRequest {
        bucket: bucket.to_owned(),
        key: filename.to_owned(),
        ..Default::default()
    };

    let result = client.get_object(&get_req).sync().expect("Couldn't GET object");


    let stream = result.body.unwrap();
    let body = stream.concat2().wait().unwrap();

    assert!(body.len() > 0);
}

我怎样才能保存这个GetObjectOutput(result)对象文件?


Rusoto 现在使用标准库 future,不再提供sync方法,所以之前的答案不再有效。

阅读记忆

use futures::stream::TryStreamExt;
use rusoto_core::Region;
use rusoto_s3::{GetObjectRequest, S3Client, S3};

type Error = Box<dyn std::error::Error>;
type Result<T, E = Error> = std::result::Result<T, E>;

const BUCKET_NAME: &str = "my very own bucket name";

#[tokio::main]
async fn main() -> Result<()> {
    let client = S3Client::new(Region::UsEast2);

    let mut object = client
        .get_object(GetObjectRequest {
            bucket: BUCKET_NAME.into(),
            ..Default::default()
        })
        .await?;

    let body = object.body.take().expect("The object has no body");

    let body = body.map_ok(|b| b.to_vec()).try_concat().await?;
    println!("body length: {}", body.len());

    Ok(())
}

AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY需要指定。我选择在代码之外设置环境变量。

流式传输到文件

use rusoto_core::Region;
use rusoto_s3::{GetObjectRequest, S3Client, S3};
use tokio::{fs::File, io};

type Error = Box<dyn std::error::Error>;
type Result<T, E = Error> = std::result::Result<T, E>;

const BUCKET_NAME: &str = "my very own bucket name";

#[tokio::main]
async fn main() -> Result<()> {
    let client = S3Client::new(Region::UsEast2);

    let mut object = client
        .get_object(GetObjectRequest {
            bucket: BUCKET_NAME.into(),
            ..Default::default()
        })
        .await?;

    let body = object.body.take().expect("The object has no body");

    let mut body = body.into_async_read();
    let mut file = File::create("/tmp/a-place-to-write").await?;
    io::copy(&mut body, &mut file).await?;

    Ok(())
}

While ByteStream有一种诱人的into_blocking_read方法,我不建议使用它。如果您尝试在异步上下文中使用它,您会遇到恐慌,因为它启动了一个嵌套的 Tokio 执行器。如果您在异步上下文之外使用它,它将截断数据除非你非常小心地使用异步运行时而不是within it.

也可以看看:

  • 使用 hyper 将块流异步写入文件
  • 如何将 futures::Stream 写入磁盘而不先将其完全存储在内存中?

依赖版本

[dependencies]
rusoto_s3 = "0.43.0"
rusoto_core = "0.43.0"
tokio = { version = "0.2.21", features = ["macros"] }
futures = "0.3.5"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将从 S3 使用 Rusoto 下载的文件保存到我的硬盘? 的相关文章

随机推荐

  • 异步写入 appengine blob 并在所有任务完成时完成它

    我有一个难题 我正在迭代一组按日期参数化的 URL 并获取它们 例如 下面是一个示例 somewebservice com start 01 01 2012 end 01 10 2012 有时 从 URL 返回的内容会被截断 缺少带有 截断
  • 在 QTextEdit/QPlainTextEdit 中设置 QTextBlock 的 [Left|Right|Top|Bottom]Margin 时出现问题

    如何为 QTextEdit QPlainTextEdit 中的每个 QTextBlock 设置不同的边距 我尝试使用以下代码设置它 class MyWidget QPlainTextEdit def func self block self
  • 如何覆盖 CodeIgniter 中未找到的页面?

    我有一个 CodeIgniter 应用程序 通常可以按我希望的方式工作 但有时用户会转到不存在的页面 并遇到不友好的错误 我想自动检测错误并向用户显示有用的信息 不是 PHP 错误 我阅读了 CodeIgniter 的用户指南 但找不到任何
  • 如何访问 SwiftUI 中视图的修饰符?

    假设我有一个View与Image有一个shadow财产 struct ContentView View var body some View let myImage Image turtlerock shadow radius 10 ret
  • 为什么 PostgreSQL 在函数中以不同方式处理我的查询?

    我有一个非常简单的查询 并不比以下复杂得多 select from table name where id 1234 运行时间不到 50 毫秒 获取该查询并将其放入函数中 CREATE OR REPLACE FUNCTION pie id
  • Django - getlist()

    我刚刚发布了这个问题jQuery 在发布请求中传递数组 我不在 post 请求中发送数组 但 jQuery 代码没有问题 问题是在 django 中接收 POST 请求 我确实喜欢这个 def portfolio add request u
  • 如何向上滚动到一个元素并单击硒?

    我有一个场景 系统需要向上滚动到页面左侧面板中的Web元素 然后单击以执行其他操作 我尝试了以下方法 但没有一个起作用 请建议 1 WebElement element driver findElement By xpath element
  • 使用公式更改小数分隔符

    我与来自多个国家 地区的团队合作 有时我会收到 Excel 文件 其中的小数点分隔符与我使用的不同 有什么公式可以做到这一点吗 我当然可以使用宏 但公式会容易得多 因为我不是公司中唯一需要这个的人 而且宏对于一般乔公众来说太复杂了 请记住
  • 如何在 SYSTEM 下运行应用程序?

    不使用windows服务 是否可以 可以通过以下方式实现 1 使用在 SYSTEM 帐户下运行的 Windows 服务的一些现有接口来通过该服务启动新进程 例如你可以使用任务调度程序 API 2 您可以安装新的Windows服务 通过服务启
  • Flex 移动应用程序中 ButtonBar 字体的样式 - 附有屏幕截图

    我正在尝试添加一个按钮栏使用以下代码在移动 Flex 应用程序的底部 CSS namespace s library ns adobe com flex spark s ActionBar s ButtonBar chromeColor 0
  • 检查 Woocommerce 中产品的产品类别

    我想在创建 或更新 后立即检查 WooCommerce 产品帖子的类别 然后根据类别运行更多代码 要检查我使用的创建 更新帖子save post对于类别has category 出问题了has category它根本不返回任何东西 我尝试更
  • 如何翻转 iOS UITableViewCell?

    我有一个包含多个单元格的表格视图 每个单元格都有一个小信息 i 按钮 我希望用户能够通过从右侧 翻转 单元格来单击该按钮来编辑该单元格中的信息 对于两种可能的单元格状态 我都有一个单独的表格单元格 XIB 并且 cellForRowAtIn
  • Cassandra 如何处理 datastax java 驱动程序中的阻塞执行语句

    阻止 com datastax driver core Session 执行方法 public ResultSet execute Statement statement 对这个方法的评论 该方法会阻塞 直到至少收到一些结果为止 数据库 但
  • 如何在sqlalchemy中使用多对多

    我想在我的项目中使用 sqlalchemy 的关系 我在简单的代码上测试多对多 from sqlalchemy import Table Column Integer String Text DateTime ForeignKey crea
  • .NET Core 动态属性的 json 序列化 (ExpandoObject)

    我在 NET Core 1 0 中有一个 Web api 我喜欢属性默认序列化为的新功能驼色肠衣代替帕斯卡套管 但是 我的一些 api 方法正在返回dynamic or ExpandoObject这些属性按原样序列化 这意味着如果我将它们作
  • Magento 扩展需要覆盖模板

    我正在为我的商店开发一个简单的扩展 它需要覆盖模板文件 相关模板用于生成订单中项目列表中的每个行项目 要查看我所说的内容 您可以转到 我的帐户 gt 我的订单 选择一个订单 然后向下滚动以查看 订购的商品 下的表格 我尝试替换的默认模板文件
  • Python,Mechanize - 即使在 set_handle_robots 和 add_headers 之后,robots.txt 也不允许请求

    我制作了一个网络爬虫 它获取所有链接直到页面的第一层 并从中获取所有链接和文本以及图像链接和 alt 这是完整的代码 import urllib import re import time from threading import Thr
  • 远程分区 - 从属变得贪婪

    以下是我们正在努力实现的目标 我们希望将一个大的 xml 文件并行地暂存在不同虚拟机的数据库中 为了实现这一目标 我们使用可扩展的 Spring Batch 远程分区方法 但我们遇到了一些问题 以下是高级设置 master 将 xml 文件
  • 按类名删除父 div - jquery

    我有一个删除链接 可以删除我页面上的当前评论 它使用ajax来更改数据库 成功后 我想删除评论所在的div 页面上的每个评论如下所示 div class aComment span class commentTitle Posted by
  • 如何将从 S3 使用 Rusoto 下载的文件保存到我的硬盘?

    我正在尝试使用 Rusoto 从存储桶下载文件 并获取文件内容 fn get object client TestClient bucket str filename str let get req GetObjectRequest buc