PyNextcloud/controllers/upload_base64.py

97 lines
3.3 KiB
Python

"""Contrôleur pour uploader des fichiers en base64 (pour clients Omnis/anciens)"""
from fastapi import APIRouter, HTTPException, Form
from fastapi.responses import JSONResponse
from nc_py_api import NextcloudException
from utils import get_nextcloud_client, create_directory_recursive, normalize_upload_paths
from typing import Optional
import base64
router = APIRouter()
@router.post("/upload-base64")
async def upload_file_base64(
path: str = Form(..., description="Chemin du dossier de destination"),
filename: str = Form(..., description="Nom du fichier"),
file_base64: str = Form(..., description="Contenu du fichier encodé en base64"),
content_type: Optional[str] = Form("application/octet-stream", description="Type MIME du fichier")
):
"""
Upload un fichier vers Nextcloud à partir de données base64
Args:
path: Chemin du dossier de destination
filename: Nom du fichier
file_base64: Contenu du fichier encodé en base64
content_type: Type MIME du fichier
Returns:
JSON contenant les informations du fichier uploadé
"""
try:
# Créer le client Nextcloud
nc = get_nextcloud_client()
# Normaliser les chemins (gère le cas où path contient déjà le nom du fichier)
directory_path, destination_path = normalize_upload_paths(path, filename)
# Créer le dossier de destination récursivement s'il n'existe pas
if directory_path != "/":
try:
create_directory_recursive(nc, 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)}"
)
# Décoder le fichier base64
try:
file_content = base64.b64decode(file_base64)
except Exception as decode_error:
raise HTTPException(
status_code=400,
detail=f"Erreur lors du décodage base64 : {str(decode_error)}"
)
# 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 '{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": filename,
"path": destination_path,
"size": len(file_content),
"content_type": 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)}"
)