Создает папки и сохраняет файлы.

This commit is contained in:
maksim 2024-12-17 23:37:34 +04:00
parent 482daf29da
commit 578e69555d
2 changed files with 77 additions and 10 deletions

Binary file not shown.

View File

@ -1,13 +1,17 @@
from fastapi import APIRouter, UploadFile, File, Form
from repository import UserRepository, CSVFileRepository, H5ModelRepository, ModelStatisticsRepository
from schemas import UserCreate, ModelStatisticsCreate
import shutil
import os
from fastapi import APIRouter, UploadFile, File, Form, HTTPException
from pathlib import Path
from database import new_session, User, CSVFile
from repository import CSVFileRepository, UserRepository, H5ModelRepository, ModelStatisticsRepository
import shutil
import pandas as pd
from sqlalchemy import select
from schemas import UserCreate, ModelStatisticsCreate
router = APIRouter()
UPLOAD_FOLDER_CSV = "uploads/csv"
os.makedirs(UPLOAD_FOLDER_CSV, exist_ok=True)
UPLOAD_FOLDER_CSV = Path("uploads/csv")
UPLOAD_FOLDER_CSV.mkdir(parents=True, exist_ok=True)
UPLOAD_FOLDER_MODELS = "uploads/models"
os.makedirs(UPLOAD_FOLDER_MODELS, exist_ok=True)
@ -18,15 +22,30 @@ async def create_user(user: UserCreate):
user_id = await UserRepository.create_user(user)
return {"user_id": user_id}
# Загрузка CSV файла
# Обновлённый метод для загрузки CSV файла
@router.post("/upload/csv/")
async def upload_csv(user_id: int = Form(...), file: UploadFile = File(...)):
file_path = os.path.join(UPLOAD_FOLDER_CSV, file.filename)
# Получаем данные пользователя
async with new_session() as session:
user = await session.get(User, user_id)
if not user:
return {"error": "Пользователь не найден"}
username = user.username
# Формируем путь для сохранения
user_folder = UPLOAD_FOLDER_CSV / str(user_id)
user_folder.mkdir(parents=True, exist_ok=True)
file_path = user_folder / file.filename
# Сохраняем файл
with open(file_path, "wb") as buffer:
shutil.copyfileobj(file.file, buffer)
await CSVFileRepository.upload_file(user_id=user_id, file_path=file_path)
return {"message": "CSV файл загружен", "file_path": file_path}
# Сохраняем данные в БД, заменяя обратные слэши на прямые
normalized_path = str(file_path).replace("\\", "/")
await CSVFileRepository.upload_file(user_id=user_id, file_path=normalized_path)
return {"message": "CSV файл загружен", "file_path": normalized_path}
# Загрузка H5 модели
@router.post("/upload/h5/")
@ -43,3 +62,51 @@ async def upload_h5_model(user_id: int = Form(...), file: UploadFile = File(...)
async def add_model_statistics(stats: ModelStatisticsCreate):
await ModelStatisticsRepository.add_statistics(stats)
return {"message": "Статистика модели сохранена"}
# Получение строк из CSV файла
@router.get("/csv/rows/")
async def get_csv_rows(
user_id: int,
file_name: str,
start_row: int,
end_row: int
):
# Проверка существования пользователя
async with new_session() as session:
user = await session.get(User, user_id)
if not user:
raise HTTPException(status_code=404, detail="Пользователь не найден")
# Формируем путь к файлу
user_folder = UPLOAD_FOLDER_CSV / str(user_id)
file_path = user_folder / file_name
# Проверка файла в БД, заменяя обратные слэши на прямые
normalized_file_path = str(file_path).replace("\\", "/")
result = await session.execute(
select(CSVFile).where(
CSVFile.user_id == user_id,
CSVFile.file_path == normalized_file_path
)
)
csv_file = result.scalars().first()
if not csv_file or not file_path.exists():
raise HTTPException(status_code=404, detail=f"Файл '{file_name}' не найден для пользователя '{user_id}'")
# Читаем файл и извлекаем строки
try:
if file_name.endswith(".xlsx"):
df = pd.read_excel(file_path)
elif file_name.endswith(".csv"):
df = pd.read_csv(file_path)
else:
raise HTTPException(status_code=400, detail="Неподдерживаемый формат файла")
rows = df.iloc[start_row:end_row].to_dict(orient="records")
return {"rows": rows}
except Exception as e:
raise HTTPException(status_code=500, detail=f"Ошибка при чтении файла: {str(e)}")