Невозможно обслуживать статические файлы

Поскольку задача состоит в том, чтобы раздавать изображения - я следую следующему руководству:
https://actix.rs/docs/static-files/

Например, я создал в проекте каталог (static) и загрузил в него 1 изображение:

< a href = "https://i.stack.imgur.com/kBHU0.jpg" rel = "nofollow noreferrer"> введите сюда описание изображения

Затем я пишу такой код:
(обратите внимание только на строчки (их всего две) с комментариями: // Taken from the guide)

use actix_cors::Cors;
use actix_web::{http, web, get, post, App, HttpResponse, HttpServer, Result};
use serde::{Deserialize, Serialize};
use actix_files::Files;  // Taken from the guide

#[derive(Serialize, Deserialize)]
struct MyObj {
    name: String,
}

#[derive(Serialize, Deserialize, Clone)]
struct MyParams {
    foo: Option<String>,
}

#[derive(Serialize, Deserialize)]
struct MyResponseObj {
    name: String,
    params: MyParams,
}

#[get("/{name}")]
async fn index_get(path: web::Path<MyObj>, params: web::Query<MyParams>) -> Result<HttpResponse> {

    Ok(HttpResponse::Ok().json(MyResponseObj {
        name: path.name.to_string(),
        params: params.clone(),
    }))
}

#[post("/{name}")]
async fn index_post(path: web::Path<MyObj>, params: web::Json<MyParams>) -> Result<HttpResponse> {

    hello().await;
    println!("{:?}", params.foo);
    println!("{:?}", path.name);

    Ok(HttpResponse::Ok().json(MyResponseObj {
        name: path.name.to_string(),
        params: params.clone(),
    }))
}


#[actix_rt::main]
async fn main() -> std::io::Result<()> {

    HttpServer::new(|| App::new()
        .wrap(
            Cors::new() // <- Construct CORS middleware builder
              .allowed_origin("http://localhost:3000")
              .allowed_methods(vec!["GET", "POST"])
              .allowed_headers(vec![http::header::AUTHORIZATION, http::header::ACCEPT])
              .allowed_header(http::header::CONTENT_TYPE)
              .max_age(3600)
              .finish())
        .service(Files::new("/static", ".")) // Taken from the guide
        .service(index_get)
        .service(index_post)

    )
        .bind("127.0.0.1:8088")?
        .run()
        .await
}



Cargo.toml

[package]
name = "hello_world"
version = "0.1.0"
authors = ["Mike_Kharkov <[email protected]>"]
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
actix-web = "3.0.1"
actix-rt = "1.1.1"
actix-cors = "0.3.0"
actix-files = "0.3.0"
postgres = "0.17.5"
serde = { version = "1.0.116", features = ["derive"] }
serde_json = "1.0"
json = "0.12"
tokio-postgres = "0.5.5"
tokio = "0.2.22"
env_logger = "0.7.1"


Вопрос:
Что еще нужно написать (и где именно), чтобы можно было ссылаться на картинку выше (например, с localhost) и не получать подобную ошибку?

 введите сюда описание изображения


person Mike Kharkov    schedule 19.09.2020    source источник
comment
Ошибка говорит, что это недействительное изображение, но какие данные оно фактически отправило?   -  person Alice Ryhl    schedule 19.09.2020
comment
В этом случае данные не требуются. Мне нужно, чтобы изображение с моего сервера открывалось в браузере. Что мне для этого нужно?   -  person Mike Kharkov    schedule 19.09.2020
comment
Я понимаю, что ты хочешь. Что отправил сервер? Мне нужно знать, чтобы лучше понять проблему, с которой вы столкнулись.   -  person Alice Ryhl    schedule 20.09.2020


Ответы (1)


Проблема решена:

.service(Files::new("/static", std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("static")))

введите описание изображения здесь

person Mike Kharkov    schedule 19.09.2020