我是个生锈菜鸟。一直试图使用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()
});发布于 2020-08-24 01:18:57
在StreamingBody客户机中使用的S3类型是来自rusoto_core的ByteStream的别名,它可以从实现futures_core::stream::Stream的类型或从Vec<u8>生成。
实现这一点的最正确方法是通过东京使用文件的异步读取,然后根据结果的字节Stream创建一个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是一个特征,而不是一个具体的类型。此外,我们不能轻松地将其用于上述reasons.StreamingBody::from而不是::new,因为我们使用的是Vec而不是实现Stream.的类型
https://stackoverflow.com/questions/63553317
复制相似问题