【问题标题】:Actix web send image as ResponseActix Web 将图像作为响应发送
【发布时间】:2021-11-23 09:54:11
【问题描述】:

我想使用路径 /images/{pic_name} 将图像发送到前端。 这是actix web方式

.service(web::resource("/images/{pic_name}").route(web::get().to(images)))

这里是功能图片:

async fn images(req: HttpRequest, info: web::Path<Info>) -> Result<HttpResponse, Error> {
      Ok(HttpResponse::build(StatusCode::OK)
            .content_type("image/jpeg")
            .body("images/".to_string() + &info.pic_name + &".jpeg"))
}

文件夹结构是:

images     -| -> inside jpeg and webp
src        -| -> inside the source files rs
Cargo.toml -|

我的货物 toml 是

[dependencies]
actix-web = "4.0.0-beta.5"
actix-service = "2.0.0-beta.5"
actix-files = "0.6.0-beta.8"
actix-rt = "2.4.0"

问题:在express sendFile方式上发送像nodejs这样的图像的方式是什么,

res.sendFile(path.join(__dirname, `/assets/images/${req.params.picName}.${acceptedHeader}`));

编辑:可能路径错误或其他原因,因为我得到 200 并且图像总是损坏。

【问题讨论】:

  • “我得到一个 200 并且图像总是损坏”这是因为您将文件路径作为实际响应发送,而不是该文件的内容。跨度>
  • 这里是 Rust 的新手,我如何发送内容?没有找到关于此的基本示例。

标签: rust actix-web


【解决方案1】:

如前所述,您发送的是路径而不是文件内容。首先,您应该通过执行以下操作来阅读内容:

let image_content = web::block(|| std::fs::read(<your path>)).await?;

block "在线程池上执行阻塞函数,返回解析为函数执行结果的未来。"之所以需要它,是因为 -- 据我所知 -- std::fs::read 正在阻塞

然后,如果你有内容,返回它:

Ok(HttpResponse::build(StatusCode::OK)
            .content_type("image/jpeg")
            .body(image_content))

【讨论】:

  • 你的答案是正确的,但是在 actix-web 4 beta 上出现了一个错误:特征 std::convert::From&lt;Result&lt;Vec&lt;u8&gt;, std::io::Error&gt;&gt; 没有为 AnyBody 实现。我会尝试解决这个问题,然后检查你的答案。谢谢
【解决方案2】:

该响应仅发送文件路径作为正文。您需要先通过标准std::fs::readtokio_fs::read 或其他方式打开并读取文件以检索其内容。请参阅this answer 了解可能的解决方案。

但是使用actix-files,并且假设不需要额外的逻辑,你只需要设置一个路由到一个新的静态文件服务。

use actix_web::App;
use actix_files::Files;

let app = App::new()
    .service(Files::new("/images", "./images"));

【讨论】:

    【解决方案3】:

    @Riwen 的解决方案是正确的,但我使用的是 actix-web 4 beta,所以它有错误导致更改,我使用的解决方案是:

    let image_content =  actix_web::web::Bytes::from(std::fs::read("src/images/".to_string() + &info.pic_name + ".jpeg")?);
    Ok(HttpResponse::build(StatusCode::OK)
    .content_type("image/jpeg")
    .body(actix_web::dev::AnyBody::Bytes(image_content)))
    

    这似乎可行,但我是 Rust 新手,不知道这是否是一个好习惯。 附言我没有像@Riwen 的回答那样使用阻塞,但图像仍然出现在前端。我将发表评论以获取更多信息。谢谢

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-21
      • 1970-01-01
      • 2013-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-04
      相关资源
      最近更新 更多