Amazon web services 使用Rusoto上传S3

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(

我是个铁锈鬼。一直在尝试使用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();
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
    ,而不是实现
    流的类型