97 lines
3.8 KiB
Python
97 lines
3.8 KiB
Python
import os
|
||
from fastapi import APIRouter, UploadFile, File, Form, HTTPException, Query
|
||
from pathlib import Path
|
||
import pandas as pd
|
||
|
||
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)}
|
||
|
||
|
||
@router.get("/csv/rows/")
|
||
async def get_csv_rows(
|
||
user_id: int,
|
||
file_name: str,
|
||
start_row: int,
|
||
end_row: int
|
||
):
|
||
# Проверка существования файла в базе данных
|
||
uploaded_file = await UploadedFileRepository.get_file_by_user_and_name(user_id, file_name)
|
||
if not uploaded_file:
|
||
raise HTTPException(status_code=404, detail=f"Файл '{file_name}' не найден для пользователя '{user_id}'")
|
||
|
||
file_path = Path(uploaded_file.file_path) # Путь к файлу из базы данных
|
||
|
||
# Проверка существования файла на диске
|
||
if not file_path.exists():
|
||
raise HTTPException(status_code=404, detail=f"Файл '{file_name}' не найден на сервере.")
|
||
|
||
# Чтение файла с использованием pandas
|
||
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="Неподдерживаемый формат файла")
|
||
|
||
# Заменяем NaN на None или другие значения перед отправкой данных
|
||
df = df.where(pd.notnull(df), None)
|
||
|
||
rows = df.iloc[start_row:end_row].to_dict(orient="records")
|
||
|
||
# Преобразуем значения NaN в None
|
||
rows = [
|
||
{key: (None if value != value else value) for key, value in row.items()}
|
||
for row in rows
|
||
]
|
||
|
||
return {"rows": rows}
|
||
|
||
except Exception as e:
|
||
raise HTTPException(status_code=500, detail=f"Ошибка при чтении файла: {str(e)}")
|
||
|
||
|