Amazon web services 使用Rusoto上传S3
我是个铁锈鬼。一直在尝试使用rusoto将一个简单的文本文件上传到S3,但无法将文件转换为流。如何将文件转换为rusoto S3 upload可接受的流Amazon web services 使用Rusoto上传S3,amazon-web-services,amazon-s3,rust,Amazon Web Services,Amazon S3,Rust,我是个铁锈鬼。一直在尝试使用rusoto将一个简单的文本文件上传到S3,但无法将文件转换为流。如何将文件转换为rusoto S3 upload可接受的流 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(
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
类型是来自rusoto_core
的ByteStream
的别名,可以从实现futures_core::stream::stream
的类型或从Vec
生成
最正确的方法是通过Tokyo异步读取文件,然后从产生的字节流
创建一个ByteStream
。但是,目前在异步生态系统中,以流的形式读取文件并没有一个完整的解决方案。有关更多详细信息,请参阅,尤其是公认答案底部的链接
另一种方法是将文件完全读入内存,就像您在提供的代码示例中所做的那样,然后从生成的Vec
创建ByteStream
。如果你这样做,你的代码就非常接近了
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(())
}
使用tokio::io::AsyncReadExt;
使用rusoto_s3::*;
使用rusoto_核心::*;
异步fn do_upload()->结果{
让s3_client=S3Client::new(Region::UsEast1);
让mut file=tokio::fs::file::open(“text.txt”)。等待?;
让mut buffer=Vec::new();
file.read_to_end(&mut buffer)。wait?;
让result=s3\u client.put\u对象(PutObjectRequest{
bucket:String::from(“bucket name”),
键:“text.txt”。到_string(),
body:Some(StreamingBody::from(buffer)),
…默认值::默认值()
}).等待?;
//有结果地做事
好(())
}
唯一真正的变化是:
从buffer
中删除Stream
注释是没有意义的,因为Stream
是一种特性,而不是具体类型。此外,由于上述原因,我们不能轻易地使用它
StreamingBody::from
而不是::new
,因为我们使用的是Vec
,而不是实现流的类型
S3客户端中使用的StreamingBody
类型是来自rusoto_core
的ByteStream
的别名,可以从实现futures_core::stream::stream
的类型或从Vec
生成
最正确的方法是通过Tokyo异步读取文件,然后从产生的字节流
创建一个ByteStream
。但是,目前在异步生态系统中,以流的形式读取文件并没有一个完整的解决方案。有关更多详细信息,请参阅,尤其是公认答案底部的链接
另一种方法是将文件完全读入内存,就像您在提供的代码示例中所做的那样,然后从生成的Vec
创建ByteStream
。如果你这样做,你的代码就非常接近了
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(())
}
使用tokio::io::AsyncReadExt;
使用rusoto_s3::*;
使用rusoto_核心::*;
异步fn do_upload()->结果{
让s3_client=S3Client::new(Region::UsEast1);
让mut file=tokio::fs::file::open(“text.txt”)。等待?;
让mut buffer=Vec::new();
file.read_to_end(&mut buffer)。wait?;
让result=s3\u client.put\u对象(PutObjectRequest{
bucket:String::from(“bucket name”),
键:“text.txt”。到_string(),
body:Some(StreamingBody::from(buffer)),
…默认值::默认值()
}).等待?;
//有结果地做事
好(())
}
唯一真正的变化是:
从buffer
中删除Stream
注释是没有意义的,因为Stream
是一种特性,而不是具体类型。此外,由于上述原因,我们不能轻易地使用它
StreamingBody::from
而不是::new
,因为我们使用的是Vec
,而不是实现流的类型