97 lines
3.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)}")