88 lines
2.8 KiB
Python
88 lines
2.8 KiB
Python
"""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)}"
|
|
)
|
|
|