gpt4 book ai didi

amazon-web-services - 使用Rusoto上传S3

转载 作者:行者123 更新时间:2023-12-03 11:42:51 24 4
gpt4 key购买 nike

我是使用rust 的菜鸟。一直试图使用rusoto将简单的文本文件上传到S3,但无法将文件转换为Stream。如何将文件转换为rusoto S3上传可接受的流。

let s3_client = S3Client::new(Region::UsEast1);
let file = File::open("text.txt").await?;
let mut reader = BufReader::new(file);
let mut buffer: Stream = Vec::new();
file.read_to_end(&mut buffer).await?;

let result = s3_client.put_object(PutObjectRequest {
bucket: String::from("bucket-name"),
key: "text.txt".to_string(),
body: Some(StreamingBody::new(buffer)),
..Default::default()
});

最佳答案

S3客户端中使用的StreamingBody类型是ByteStreamrusoto_core的别名,可以从实现futures_core::stream::Stream的类型或从Vec<u8>生成。
完成此操作的最正确方法是通过东京使用异步读取文件,然后根据生成的字节ByteStream创建Stream。但是,目前在异步生态系统中,将文件读取为Stream并没有完善的解决方案。有关更多详细信息,请参见this SO question,尤其是已接受答案底部的链接。
另一种方法是像在提供的代码示例中一样将文件完全读取到内存中,然后从生成的ByteStream创建Vec<u8>。如果这样做,您的代码就非常接近了。

use tokio::io::AsyncReadExt;
use rusoto_s3::*;
use rusoto_core::*;

async fn do_upload() -> Result<(), Box<dyn std::error::Error>> {
let s3_client = S3Client::new(Region::UsEast1);
let mut file = tokio::fs::File::open("text.txt").await?;
let mut buffer = Vec::new();
file.read_to_end(&mut buffer).await?;

let result = s3_client.put_object(PutObjectRequest {
bucket: String::from("bucket-name"),
key: "text.txt".to_string(),
body: Some(StreamingBody::from(buffer)),
..Default::default()
}).await?;
// do thing with result
Ok(())
}
唯一真正的变化是:
  • Stream中删除了buffer批注,这实际上没有任何意义,因为Stream是一个特征而不是一个具体的类型。另外,由于上述原因,我们不能轻易使用它。
  • StreamingBody::from而不是::new,因为我们使用的是Vec而不是实现Stream的类型。
  • 关于amazon-web-services - 使用Rusoto上传S3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63553317/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com