diff --git a/fastapi-app-upload/database/enums/type_file.py b/fastapi-app-upload/database/enums/type_file.py new file mode 100644 index 0000000..d483772 --- /dev/null +++ b/fastapi-app-upload/database/enums/type_file.py @@ -0,0 +1,5 @@ +import enum + +class FileType(enum.Enum): + xlsx = "xlsx" + csv = "csv" diff --git a/fastapi-app-upload/database/models/csv_file.py b/fastapi-app-upload/database/models/csv_file.py deleted file mode 100644 index 7a5207e..0000000 --- a/fastapi-app-upload/database/models/csv_file.py +++ /dev/null @@ -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) \ No newline at end of file diff --git a/fastapi-app-upload/database/models/uploaded_file.py b/fastapi-app-upload/database/models/uploaded_file.py new file mode 100644 index 0000000..7d3a451 --- /dev/null +++ b/fastapi-app-upload/database/models/uploaded_file.py @@ -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) \ No newline at end of file diff --git a/fastapi-app-upload/main.py b/fastapi-app-upload/main.py index 7894914..88bb5b9 100644 --- a/fastapi-app-upload/main.py +++ b/fastapi-app-upload/main.py @@ -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 diff --git a/fastapi-app-upload/repositories/csv_file_repository.py b/fastapi-app-upload/repositories/csv_file_repository.py deleted file mode 100644 index d46c8bb..0000000 --- a/fastapi-app-upload/repositories/csv_file_repository.py +++ /dev/null @@ -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() \ No newline at end of file diff --git a/fastapi-app-upload/repositories/uploaded_file_repository.py b/fastapi-app-upload/repositories/uploaded_file_repository.py new file mode 100644 index 0000000..b830ef8 --- /dev/null +++ b/fastapi-app-upload/repositories/uploaded_file_repository.py @@ -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() \ No newline at end of file diff --git a/fastapi-app-upload/routers/csv_router.py b/fastapi-app-upload/routers/csv_router.py deleted file mode 100644 index 9b053b9..0000000 --- a/fastapi-app-upload/routers/csv_router.py +++ /dev/null @@ -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} - diff --git a/fastapi-app-upload/routers/uploaded_file_router.py b/fastapi-app-upload/routers/uploaded_file_router.py new file mode 100644 index 0000000..91af5e6 --- /dev/null +++ b/fastapi-app-upload/routers/uploaded_file_router.py @@ -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)} + diff --git a/fastapi-app-upload/schemas/csv_file_upload.py b/fastapi-app-upload/schemas/uploaded_file_upload.py similarity index 74% rename from fastapi-app-upload/schemas/csv_file_upload.py rename to fastapi-app-upload/schemas/uploaded_file_upload.py index 3c9b4c2..45657b3 100644 --- a/fastapi-app-upload/schemas/csv_file_upload.py +++ b/fastapi-app-upload/schemas/uploaded_file_upload.py @@ -3,5 +3,5 @@ from datetime import datetime from typing import Optional # CSVFileUpload: для загрузки CSV файла -class CSVFileUpload(BaseModel): +class UploadedFile(BaseModel): file_path: str \ No newline at end of file