108 lines
3.7 KiB
Python
108 lines
3.7 KiB
Python
"""Contrôleur pour uploader des fichiers vers Nextcloud"""
|
|
from fastapi import APIRouter, HTTPException, UploadFile, File, Form
|
|
from fastapi.responses import JSONResponse
|
|
from nc_py_api import NextcloudException
|
|
from utils import get_nextcloud_client
|
|
from typing import Optional
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
@router.post("/upload")
|
|
async def upload_file(
|
|
file: UploadFile = File(..., description="Fichier à uploader"),
|
|
path: str = Form(..., description="Chemin du dossier de destination (ex: /Documents)"),
|
|
filename: Optional[str] = Form(None, description="Nom du fichier (optionnel, utilise le nom original si non spécifié)")
|
|
):
|
|
"""
|
|
Upload un fichier vers un dossier Nextcloud
|
|
|
|
Args:
|
|
file: Le fichier à uploader
|
|
path: Chemin du dossier de destination
|
|
filename: Nom du fichier (optionnel)
|
|
|
|
Returns:
|
|
JSON contenant les informations du fichier uploadé
|
|
"""
|
|
try:
|
|
# Créer le client Nextcloud
|
|
nc = get_nextcloud_client()
|
|
|
|
# Déterminer le nom du fichier
|
|
final_filename = filename if filename else file.filename
|
|
|
|
# Normaliser le chemin de destination
|
|
if path == "/" or path == "":
|
|
destination_path = f"/{final_filename}"
|
|
directory_path = "/"
|
|
else:
|
|
# Enlever les slashes de début/fin et ajouter le nom du fichier
|
|
clean_path = path.strip("/")
|
|
destination_path = f"/{clean_path}/{final_filename}"
|
|
directory_path = f"/{clean_path}"
|
|
|
|
# Vérifier si le dossier existe, sinon le créer
|
|
if directory_path != "/":
|
|
try:
|
|
# Vérifier si le dossier existe
|
|
nc.files.by_path(directory_path)
|
|
except NextcloudException as e:
|
|
if "404" in str(e):
|
|
# Le dossier n'existe pas, on le crée
|
|
try:
|
|
nc.files.mkdir(directory_path)
|
|
print(f"📁 Dossier créé : {directory_path}")
|
|
except Exception as mkdir_error:
|
|
raise HTTPException(
|
|
status_code=500,
|
|
detail=f"Impossible de créer le dossier '{directory_path}': {str(mkdir_error)}"
|
|
)
|
|
|
|
# Lire le contenu du fichier
|
|
file_content = await file.read()
|
|
|
|
# Uploader le fichier vers Nextcloud
|
|
try:
|
|
nc.files.upload(
|
|
path=destination_path,
|
|
content=file_content
|
|
)
|
|
except NextcloudException as e:
|
|
if "409" in str(e) or "412" in str(e):
|
|
raise HTTPException(
|
|
status_code=409,
|
|
detail=f"Le fichier '{final_filename}' existe déjà"
|
|
)
|
|
else:
|
|
raise HTTPException(
|
|
status_code=500,
|
|
detail=f"Erreur Nextcloud: {str(e)}"
|
|
)
|
|
|
|
# Retourner les informations du fichier uploadé
|
|
result = {
|
|
"success": True,
|
|
"message": "Fichier uploadé avec succès",
|
|
"file": {
|
|
"name": final_filename,
|
|
"path": destination_path,
|
|
"size": len(file_content),
|
|
"content_type": file.content_type
|
|
}
|
|
}
|
|
|
|
return JSONResponse(content=result, status_code=201)
|
|
|
|
except HTTPException:
|
|
raise
|
|
except Exception as e:
|
|
raise HTTPException(
|
|
status_code=500,
|
|
detail=f"Erreur interne: {str(e)}"
|
|
)
|
|
finally:
|
|
# Fermer le fichier uploadé
|
|
await file.close()
|
|
|