首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Rusoto进行S3上传

使用Rusoto进行S3上传
EN

Stack Overflow用户
提问于 2020-08-24 00:34:01
回答 1查看 798关注 0票数 0

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

代码语言:javascript
复制
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()
});
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-24 01:18:57

StreamingBody客户机中使用的S3类型是来自rusoto_coreByteStream的别名,它可以从实现futures_core::stream::Stream的类型或从Vec<u8>生成。

实现这一点的最正确方法是通过东京使用文件的异步读取,然后根据结果的字节Stream创建一个Stream。但是,在异步生态系统中,以Stream的形式读取文件还没有一个完整的解决方案。有关更多细节,请参见this SO question,特别是可接受答案底部的链接。

另一种方法是像在提供的代码示例中所做的那样,将文件完全读入内存,然后从生成的ByteStream创建一个Vec<u8>。如果您这样做,您的代码是相当接近。

代码语言:javascript
复制
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(())
}

真正的变化是:

  1. Stream注释从buffer中删除,这实际上没有意义,因为Stream是一个特征,而不是一个具体的类型。此外,我们不能轻松地将其用于上述reasons.
  2. StreamingBody::from而不是::new,因为我们使用的是Vec而不是实现Stream.

的类型

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63553317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档