"""Contrôleur pour télécharger des fichiers depuis Nextcloud en base64""" from fastapi import APIRouter, HTTPException from fastapi.responses import JSONResponse from nc_py_api import NextcloudException from utils import get_nextcloud_client, format_file_info import base64 router = APIRouter() @router.get("/download-base64/{path:path}") async def download_file_base64(path: str): """ Télécharge un fichier depuis Nextcloud et le retourne encodé en base64 Args: path: Chemin complet du fichier (ex: /Documents/rapport.pdf) Returns: JSON contenant le fichier encodé en base64 et ses métadonnées """ try: # Créer le client Nextcloud nc = get_nextcloud_client() # Normaliser le chemin du fichier if not path.startswith("/"): file_path = "/" + path.strip("/") else: file_path = path.strip() # Vérifier que le fichier existe et récupérer ses informations try: file_info = nc.files.by_path(file_path) except NextcloudException as e: if "404" in str(e): raise HTTPException( status_code=404, detail=f"Le fichier '{file_path}' n'existe pas" ) else: raise HTTPException( status_code=500, detail=f"Erreur Nextcloud: {str(e)}" ) # Vérifier que c'est bien un fichier et non un dossier if file_info.is_dir: raise HTTPException( status_code=400, detail=f"'{file_path}' est un dossier, pas un fichier" ) # Télécharger le contenu du fichier try: file_content = nc.files.download(file_path) except NextcloudException as e: raise HTTPException( status_code=500, detail=f"Erreur lors du téléchargement : {str(e)}" ) # Encoder le contenu en base64 file_base64 = base64.b64encode(file_content).decode('utf-8') # Préparer la réponse avec les métadonnées result = { "success": True, "file": { "name": file_info.name, "path": file_path, "size": len(file_content), "content_type": getattr(file_info.info, 'mimetype', 'application/octet-stream') if hasattr(file_info, 'info') else 'application/octet-stream', "file_base64": file_base64 } } return JSONResponse(content=result) except HTTPException: raise except Exception as e: raise HTTPException( status_code=500, detail=f"Erreur interne: {str(e)}" )