Переименовали + сохраняется файл локально, поменялось бд и концепция хранения. Мы храним именно файл

This commit is contained in:
maksim 2025-03-09 18:24:44 +04:00
parent f75af08be6
commit 74ddde1550
9 changed files with 88 additions and 62 deletions

@ -0,0 +1,5 @@
import enum
class FileType(enum.Enum):
xlsx = "xlsx"
csv = "csv"

@ -1,13 +0,0 @@
from datetime import datetime
from sqlalchemy import ForeignKey
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship
from database.database import Base
class CSVFile(Base):
__tablename__ = "csv_files"
id: Mapped[int] = mapped_column(primary_key=True)
user_id: Mapped[int]
file_path: Mapped[str]
uploaded_at: Mapped[datetime] = mapped_column(default=datetime.utcnow)

@ -0,0 +1,19 @@
from datetime import datetime
from sqlalchemy import ForeignKey
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship
from database.database import Base
from database.enums.type_file import FileType
class UploadedFile(Base):
__tablename__ = "uploaded_files"
id: Mapped[int] = mapped_column(primary_key=True)
user_id: Mapped[int]
user_name: Mapped[str]
file_name: Mapped[str]
file_path: Mapped[str]
file_type: Mapped[FileType]
file_size: Mapped[float]
file_time: Mapped[datetime] = mapped_column(default=datetime.utcnow)

@ -3,7 +3,7 @@ from fastapi import FastAPI
from contextlib import asynccontextmanager
from database.database import create_tables, delete_tables
from routers.csv_router import router as csv_router
from routers.uploaded_file_router import router as csv_router

@ -1,11 +0,0 @@
from database.database import new_session
from database.models.csv_file import CSVFile
class CSVFileRepository:
@staticmethod
async def upload_file(user_id: int, file_path: str):
async with new_session() as session:
csv_file = CSVFile(user_id=user_id, file_path=file_path)
session.add(csv_file)
await session.commit()

@ -0,0 +1,12 @@
from database.database import new_session
from database.enums.type_file import FileType
from database.models.uploaded_file import UploadedFile
class UploadedFileRepository:
@staticmethod
async def upload_file(user_id: int, user_name: str, file_path: str, file_name: str, file_type: FileType, file_size: float):
async with new_session() as session:
csv_file = UploadedFile(user_id=user_id, user_name=user_name, file_path=file_path, file_name=file_name, file_type=file_type, file_size=file_size )
session.add(csv_file)
await session.commit()

@ -1,36 +0,0 @@
import os
from fastapi import APIRouter, UploadFile, File, Form, HTTPException
from pathlib import Path
from database.database import new_session
import shutil
import pandas as pd
from sqlalchemy import select
from repositories.csv_file_repository import CSVFileRepository
router = APIRouter()
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)
# Обновлённый метод для загрузки CSV файла
@router.post("/upload/csv/")
async def upload_csv(user_id: int = Form(...), file: UploadFile = File(...)):
# Формируем путь для сохранения
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)
# Сохраняем данные в БД, заменяя обратные слэши на прямые
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}

@ -0,0 +1,50 @@
import os
from fastapi import APIRouter, UploadFile, File, Form, HTTPException
from pathlib import Path
from database.database import new_session
import shutil
from database.enums.type_file import FileType
from repositories.uploaded_file_repository import UploadedFileRepository
router = APIRouter()
UPLOAD_FOLDER_CSV = Path("uploads/file")
UPLOAD_FOLDER_CSV.mkdir(parents=True, exist_ok=True)
@router.post("/upload/file/")
async def upload_file(user_id: int, user_name: str, file: UploadFile = File(...), file_type: FileType = Form(...)):
# Проверяем, что тип файла корректен
if file_type not in FileType:
raise HTTPException(status_code=400, detail="Неверный тип файла")
# Формируем путь для сохранения
user_folder = UPLOAD_FOLDER_CSV / (str(user_id) + "_" + user_name)
user_folder.mkdir(parents=True, exist_ok=True)
file_path = user_folder / file.filename
# Сохраняем файл на диск
try:
with open(file_path, "wb") as buffer:
shutil.copyfileobj(file.file, buffer)
except Exception as e:
raise HTTPException(status_code=500, detail=f"Ошибка при сохранении файла: {str(e)}")
# Получаем размер файла
file_size = os.path.getsize(file_path) / (1024 * 1024) # Размер в мегабайтах
# Сохраняем данные о файле в базу данных
try:
await UploadedFileRepository.upload_file(
user_id=user_id,
user_name=user_name,
file_path=str(file_path).replace("\\", "/"),
file_name=file.filename,
file_type=file_type,
file_size=file_size
)
except Exception as e:
raise HTTPException(status_code=500, detail=f"Ошибка при сохранении данных в базе данных: {str(e)}")
return {"message": "Файл успешно загружен", "file_path": str(file_path), "file_size_MB": round(file_size, 2)}

@ -3,5 +3,5 @@ from datetime import datetime
from typing import Optional
# CSVFileUpload: для загрузки CSV файла
class CSVFileUpload(BaseModel):
class UploadedFile(BaseModel):
file_path: str