✨ feat(FolderZipArchiver): téléchargement d'un dossier entier en zip#274
Merged
Conversation
…--init Chaque instance créée via bin/deploy-all.sh --init repartait sur MAILER_DSN=null://null (défaut de .env) : aucun email d'invitation ni de réinitialisation de mot de passe ne partait. MAILER_DSN_PRESET était déjà prévu dans .secrets mais jamais lu ni injecté, contrairement à DB_PASSWORD_PRESET qui suit le même pattern.
Nécessaire pour ZipArchive (FolderZipArchiver, #240) — déjà présente sur l'environnement mais pas déclarée, comme ext-gd/ext-exif avant elle.
…dossier Parcourt Folder::getChildren()/getFiles() (relation Doctrine déjà en place) plutôt que la CTE SQL findDescendantIds() : la hiérarchie nécessaire au chemin relatif dans le zip est directement portée par les entités. Fichier physique manquant sur disque -> ignoré silencieusement plutôt que de faire échouer tout le zip. Part de #240.
GET /folders/{id}/download — même modèle de sécurité que FileDownloadController
(ResourceAccessChecker::canRead, owner ou partage actif). Réutilise
FolderZipArchiver pour générer l'archive, streamée via BinaryFileResponse
avec suppression du fichier temporaire après envoi.
Closes #240.
Lien vers app_folder_download à côté de Renommer/Déplacer/Partager/Supprimer. Part de #240.
ronan-develop
added a commit
that referenced
this pull request
Jul 20, 2026
…manuel) (#300) - cicd.md affirmait un déploiement automatique via webhook après CI verte — faux : le webhook public/deploy.php est cassé (401 depuis plusieurs jours) et de toute façon plus utilisé, le déploiement réel est manuel via bin/deploy-all.sh. DEPLOY_WORKFLOW.md/DEPLOY_SECRETS.md annotés "non implémenté" plutôt que réécrits (référence technique valide si #288 reprend). - avancement.md rattrapé : #274 à #299 (zip dossier, drag-drop, viewer PDF, scan PDF actif + fix Content-Type décalé, page changelog auto-alimentée + pagination + PrTitleCleaner, centralisation factories, 7e instance baptiste, découvertes déploiement — webhook cassé, SshWhitelist, piège IP dynamique/VPN entreprise). - deploiement.md : piège IP dynamique/VPN + API SshWhitelist documentés. - technique.md : Factory/ ajouté à la structure src/, section Déploiement corrigée (même faux "automatique"). - features.md : limite EXIF RAW obsolète corrigée (lu depuis #269, sauf CR3), viewer PDF/zip dossier/changelog ajoutés. - README.md : nombre de tests obsolète (738 → 832, 17 → 25 suites Jest).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Résumé
GET /folders/{id}/download: génère et streame un zip récursif du dossier (sous-dossiers + fichiers), même modèle de sécurité queFileDownloadController(owner ou partage actif viaResourceAccessChecker)FolderZipArchiver: parcourtFolder::getChildren()/getFiles()pour construire l'arborescence dans le zip ; fichier physique manquant sur disque → ignoré silencieusementFolderCardext-zipdéclarée danscomposer.jsonAu passage (contexte découvert en investiguant #240, sans lien direct avec le zip) :
bin/deploy-all.shinjecte désormaisMAILER_DSN_PRESETautomatiquement à l'--init(avant : chaque nouvelle instance repartait surMAILER_DSN=null://null, aucun email d'invitation/reset ne partait).github/avancement.mdmis à jour (suivi du travail mergé récemment : PDF viewer, worker média, EXIF, partage async, mailer_dsn)Closes #240
Test plan
TailwindBuildTest, préexistant, environnement local sans build CSS)demo@homecloud.local, téléchargement du dossier "Documents" et "Uploads" depuis/explorer→ zip valide contenant les bons fichierstests/Web/FolderDownloadWebTest.php(auth, ownership, partage, 404, headers) +tests/Integration/FolderZipArchiverIntegrationTest.php(structure du zip, dossier vide, fichier manquant sur disque)