Переименовали + сохраняется файл локально, поменялось бд и концепция хранения. Мы храним именно файл
This commit is contained in:
parent
f75af08be6
commit
74ddde1550
fastapi-app-upload
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 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)}
|
||||
|
2
fastapi-app-upload/schemas/csv_file_upload.py → fastapi-app-upload/schemas/uploaded_file_upload.py
2
fastapi-app-upload/schemas/csv_file_upload.py → 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
|
Loading…
x
Reference in New Issue
Block a user