Переименовали + сохраняется файл локально, поменялось бд и концепция хранения. Мы храним именно файл
This commit is contained in:
parent
f75af08be6
commit
74ddde1550
5
fastapi-app-upload/database/enums/type_file.py
Normal file
5
fastapi-app-upload/database/enums/type_file.py
Normal file
@ -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)
|
|
19
fastapi-app-upload/database/models/uploaded_file.py
Normal file
19
fastapi-app-upload/database/models/uploaded_file.py
Normal file
@ -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 contextlib import asynccontextmanager
|
||||||
|
|
||||||
from database.database import create_tables, delete_tables
|
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()
|
|
12
fastapi-app-upload/repositories/uploaded_file_repository.py
Normal file
12
fastapi-app-upload/repositories/uploaded_file_repository.py
Normal file
@ -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}
|
|
||||||
|
|
50
fastapi-app-upload/routers/uploaded_file_router.py
Normal file
50
fastapi-app-upload/routers/uploaded_file_router.py
Normal file
@ -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
|
from typing import Optional
|
||||||
|
|
||||||
# CSVFileUpload: для загрузки CSV файла
|
# CSVFileUpload: для загрузки CSV файла
|
||||||
class CSVFileUpload(BaseModel):
|
class UploadedFile(BaseModel):
|
||||||
file_path: str
|
file_path: str
|
Loading…
x
Reference in New Issue
Block a user