This commit is contained in:
parent
01b560085e
commit
e3937e70ae
1
Cargo.lock
generated
1
Cargo.lock
generated
|
@ -1181,6 +1181,7 @@ dependencies = [
|
||||||
"aws-sdk-s3",
|
"aws-sdk-s3",
|
||||||
"futures",
|
"futures",
|
||||||
"image",
|
"image",
|
||||||
|
"log",
|
||||||
"mime_guess",
|
"mime_guess",
|
||||||
"redis",
|
"redis",
|
||||||
"reqwest",
|
"reqwest",
|
||||||
|
|
|
@ -21,6 +21,7 @@ image = "0.25.2"
|
||||||
mime_guess = "2.0.5"
|
mime_guess = "2.0.5"
|
||||||
aws-config = "1.5.5"
|
aws-config = "1.5.5"
|
||||||
actix-multipart = "0.7.2"
|
actix-multipart = "0.7.2"
|
||||||
|
log = "0.4.22"
|
||||||
|
|
||||||
[[bin]]
|
[[bin]]
|
||||||
name = "quoter"
|
name = "quoter"
|
||||||
|
|
|
@ -2,6 +2,7 @@ use actix_multipart::Multipart;
|
||||||
use actix_web::{error::ErrorInternalServerError, web, HttpRequest, HttpResponse, Result};
|
use actix_web::{error::ErrorInternalServerError, web, HttpRequest, HttpResponse, Result};
|
||||||
use futures::StreamExt;
|
use futures::StreamExt;
|
||||||
use mime_guess::MimeGuess;
|
use mime_guess::MimeGuess;
|
||||||
|
use log::{info, warn};
|
||||||
|
|
||||||
use crate::app_state::AppState;
|
use crate::app_state::AppState;
|
||||||
use crate::auth::{get_id_by_token, user_added_file};
|
use crate::auth::{get_id_by_token, user_added_file};
|
||||||
|
@ -124,30 +125,40 @@ pub async fn proxy_handler(
|
||||||
path: web::Path<String>,
|
path: web::Path<String>,
|
||||||
state: web::Data<AppState>,
|
state: web::Data<AppState>,
|
||||||
) -> Result<HttpResponse, actix_web::Error> {
|
) -> Result<HttpResponse, actix_web::Error> {
|
||||||
|
info!("proxy_handler вызван с путем: {}", path);
|
||||||
|
|
||||||
// весь запрошенный путь
|
// весь запрошенный путь
|
||||||
let requested_path = state.get_path(&path).await.unwrap().unwrap();
|
let requested_path = state.get_path(&path).await.unwrap().unwrap();
|
||||||
|
info!("Запрошенный путь: {}", requested_path);
|
||||||
|
|
||||||
// имя файла
|
// имя файла
|
||||||
let filename_with_extension = requested_path.split("/").last().unwrap();
|
let filename_with_extension = requested_path.split("/").last().unwrap();
|
||||||
|
info!("Имя файла с расширением: {}", filename_with_extension);
|
||||||
|
|
||||||
// убираем расширение файла
|
// убираем расширение файла
|
||||||
let requested_filekey = filename_with_extension
|
let requested_filekey = filename_with_extension
|
||||||
.rsplit_once('.')
|
.rsplit_once('.')
|
||||||
.map(|(name, _ext)| name)
|
.map(|(name, _ext)| name)
|
||||||
.unwrap_or(filename_with_extension); // Если расширение отсутствует, возвращаем оригинальное имя
|
.unwrap_or(filename_with_extension);
|
||||||
|
info!("Запрошенный ключ файла: {}", requested_filekey);
|
||||||
|
|
||||||
// Проверяем, запрошена ли миниатюра
|
// Проверяем, запрошена ли миниатюра
|
||||||
if let Some((base_filename, requested_width, _ext)) =
|
if let Some((base_filename, requested_width, _ext)) =
|
||||||
parse_thumbnail_request(&requested_filekey)
|
parse_thumbnail_request(&requested_filekey)
|
||||||
{
|
{
|
||||||
|
info!("Запрошена миниатюра. Базовое имя файла: {}, Запрошенная ширина: {}", base_filename, requested_width);
|
||||||
|
|
||||||
// Находим ближайший подходящий размер
|
// Находим ближайший подходящий размер
|
||||||
let closest_width = find_closest_width(requested_width);
|
let closest_width = find_closest_width(requested_width);
|
||||||
let thumbnail_key = format!("{}_{}", base_filename, closest_width);
|
let thumbnail_key = format!("{}_{}", base_filename, closest_width);
|
||||||
|
info!("Ближайшая ширина: {}, Ключ миниатюры: {}", closest_width, thumbnail_key);
|
||||||
|
|
||||||
// Проверяем наличие миниатюры в кэше
|
// Проверяем наличие миниатюры в кэше
|
||||||
let cached_files = state.get_cached_file_list().await;
|
let cached_files = state.get_cached_file_list().await;
|
||||||
if !cached_files.contains(&thumbnail_key) {
|
if !cached_files.contains(&thumbnail_key) {
|
||||||
|
info!("Миниатюра не найдена в кэше");
|
||||||
if cached_files.contains(&base_filename) {
|
if cached_files.contains(&base_filename) {
|
||||||
|
info!("Оригинальный файл найден в кэше, генерируем миниатюру");
|
||||||
// Загружаем оригинальный файл из S3
|
// Загружаем оригинальный файл из S3
|
||||||
let original_data =
|
let original_data =
|
||||||
load_file_from_s3(&state.s3_client, &state.s3_bucket, &base_filename).await?;
|
load_file_from_s3(&state.s3_client, &state.s3_bucket, &base_filename).await?;
|
||||||
|
@ -169,17 +180,20 @@ pub async fn proxy_handler(
|
||||||
"image/jpeg",
|
"image/jpeg",
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
info!("Миниатюра сгенерирована и загружена в S3");
|
||||||
return Ok(HttpResponse::Ok()
|
return Ok(HttpResponse::Ok()
|
||||||
.content_type("image/jpeg")
|
.content_type("image/jpeg")
|
||||||
.body(thumbnail_bytes));
|
.body(thumbnail_bytes));
|
||||||
|
} else {
|
||||||
|
warn!("Оригинальный файл не найден в кэше");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Если миниатюра уже есть в кэше, просто возвращаем её
|
info!("Миниатюра найдена в кэше, возвращаем её");
|
||||||
return serve_file(&thumbnail_key, &state).await;
|
return serve_file(&thumbnail_key, &state).await;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Если запрошен целый файл
|
// Если запрошен целый файл
|
||||||
|
info!("Запрошен целый файл, возвращаем его");
|
||||||
serve_file(&requested_filekey, &state).await
|
serve_file(&requested_filekey, &state).await
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@ mod handlers;
|
||||||
mod s3_utils;
|
mod s3_utils;
|
||||||
mod thumbnail;
|
mod thumbnail;
|
||||||
|
|
||||||
use actix_web::{middleware::Logger, web, App, HttpServer, HttpResponse};
|
use actix_web::{middleware::Logger, web, App, HttpServer};
|
||||||
use app_state::AppState;
|
use app_state::AppState;
|
||||||
use handlers::{proxy_handler, upload_handler};
|
use handlers::{proxy_handler, upload_handler};
|
||||||
use tokio::task::spawn_blocking;
|
use tokio::task::spawn_blocking;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user