微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么有时使用Rusoto从S3下载文件有时会返回一个空白字符串?

如何解决为什么有时使用Rusoto从S3下载文件有时会返回一个空白字符串?

我正在尝试使用rusoto从S3存储桶中的现有文件获取主体。我的body.unwrap返回一个空字符串,但我不明白为什么。我没有任何问题或错误,并且我的文件很好。

看来我有时从S3收到空白内容。这是一个快速而肮脏的补丁,还有其他更好的方法吗?喜欢使用S3哈希吗?

pub fn get_object(
    access_key_id: &str,secret_access_key: &str,region: &Region,bucket_name: &str,object_key: &str,) -> Result<FileContent,Error> {
    let credentials = StaticProvider::new(
        access_key_id.to_string(),secret_access_key.to_string(),None,);

    let client = Client::new_with(credentials,HttpClient::new().unwrap());
    let s3_client = S3Client::new_with_client(client,region.clone());

    let mut or = GetobjectRequest::default();
    or.bucket = bucket_name.to_string();
    or.key = object_key.to_string();
    let _ = env_logger::try_init();
    let get_object_output = s3_client.get_object(or);
    let r = async_run(get_object_output);

    let _err = Error::new(
        ErrorKind::Other,format!(
            "something goes wrong while getting object {} in the S3 bucket {}",object_key,bucket_name
        ),);

    match r {
        Err(err) => {
            warn!("{}",err);
            Err(_err)
        }

        Ok(x) => {
            let mut s = String::new();
            x.body.unwrap().into_blocking_read().read_to_string(&mut s);

            if s.is_empty() {
                // It looks like we receive sometimes empty content from s3. This is a quick and dirty patch,is there another better way ? Like using s3 Hash ?
                return Err(Error::new(
                    ErrorKind::InvalidData,"file content is empty - which is not the expected content - what's wrong?",));
            }

            Ok(s)
        }
    }
}

这是我的Tokio集成:

use std::future::Future;
use tokio::runtime::Runtime;

pub fn async_run<F: Future>(future: F) -> F::Output {
    // Todo improve - is it efficient to create a Runtime at each exec?
    let mut runtime = Runtime::new().expect("unable to create a tokio runtime");
    runtime.block_on(future)
}

似乎Tokio不能按预期工作。

解决了我的问题:我的互联网速度非常低,如果rusoto多次失败,我会使用AWS CLI。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。