rust 使用Axum Multipart进行S3上传

smdnsysy  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(172)

我的Axum应用程序中有一个多部分表单端点。文件上传表单字段应该像这样阅读:

// let mut field: axum::extract::multipart::Field
while let Some(chunk) = field.chunk().await? {
    // Do something with chunk: Bytes
}
// Done

在另一边,我有s3::Bucketrust-s3 crate),它的方法put_object_stream需要tokio::io::AsyncRead。如何使它们一起工作,而不将整个文件保存在内存或磁盘上?

fcg9iug3

fcg9iug31#

如果你有一个多部分的Field,并想将它用作tokio::io::AsyncRead类型,你可以使用tokio_util::io::StreamReader,因为Field实现了Stream<Item = Result<Bytes, MultipartError>>。不过,由于AsyncRead的接口使用std::io::Error,因此您必须首先将MultipartError转换为std::io::Error

[dependencies] # additional
futures = "0.3.28"
tokio-util = { version = "0.7.9", features = ["io"] }
use axum::extract::multipart::Field;
use futures::TryStreamExt;
use tokio_util::io::StreamReader;

let field: Field = ...;

let reader = StreamReader::new(field.map_err(|multipart_error| {
    std::io::Error::new(std::io::ErrorKind::Other, multipart_error)
}));

相关问题