zero4rs 2.0.0

zero4rs is a powerful, pragmatic, and extremely fast web framework for Rust
Documentation
use crate::prelude2::*;

use futures_util::stream::StreamExt;

use mongodb::bson::doc;

// 处理所有用户头像显示 profile_picture (pp)
pub async fn profile_picture(
    resource_id: actix_web::web::Path<String>,
    app_state: web::Data<AppContext>,
) -> impl Responder {
    let filter = doc! {"resource_id": resource_id.into_inner(), "upload_type": "profile_picture"};

    get_file(app_state.mongo(), filter, 0).await
}

// 返回用户头像
pub async fn avator(
    user_id: actix_web::web::Path<String>,
    app_state: web::Data<AppContext>,
) -> impl Responder {
    let filter = doc! {"user_id": user_id.into_inner(), "upload_type": "profile_picture"};

    get_file(app_state.mongo(), filter, 0).await
}

pub async fn get_file(
    mongo: &crate::core::mongo::MongoClient,
    filter: mongodb::bson::Document,
    skip: usize,
) -> impl Responder {
    match mongo
        .get_file_with_opts(
            &crate::sitepages::upload0::GRID_FS_DATABASE_NAME,
            doc! {"created_at": -1},
            filter,
            skip,
        )
        .await
    {
        Ok((mime_type, mut _stream)) => {
            // >>> 下载图片
            let stream = async_stream::stream! {
                while let Some(chunk) = _stream.next().await {
                    yield Ok::<_, actix_web::Error>(web::Bytes::from(chunk));
                }
            };

            let mut response = HttpResponse::Ok();

            // 告诉浏览器直接显示而不是下载
            response.append_header((actix_web::http::header::CONTENT_DISPOSITION, "inline"));

            match mime_type {
                Some(mime_type) => {
                    // 设置适当的 Content-Type 头
                    response.content_type(mime_type);
                }
                None => {
                    // 假设图像是 JPEG 格式
                    response.content_type("image/jpeg");
                }
            }

            // 将异步流添加到响应中
            response.streaming(stream)
        }
        Err(_) => {
            // 返回占位图片
            let _byte_content = std::fs::read("./RichMedias/images/30916342.jpg").unwrap();

            let stream = futures_util::stream::iter(vec![_byte_content])
                .map(|chunk| Ok::<_, actix_web::Error>(web::Bytes::from(chunk)))
                .boxed();

            let response = HttpResponse::Ok()
                .content_type("image/jpeg")
                .streaming(stream);

            response
        }
    }
}