From 9c0eba8d2d20f999b02ff7774afe788029d6d117 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois?= Date: Mon, 19 Oct 2026 09:31:56 +0200 Subject: [PATCH] fix filename bug --- appinfo/routes.php | 11 +-- lib/Controller/PageController.php | 95 ++++++++++++++++++++- src/App.vue | 125 +++++++++++++++++++++++----- src/components/FileTable.vue | 2 +- src/components/WebContentViewer.vue | 21 +++-- 5 files changed, 219 insertions(+), 35 deletions(-) diff --git a/appinfo/routes.php b/appinfo/routes.php index f91f7dd..c1dd547 100644 --- a/appinfo/routes.php +++ b/appinfo/routes.php @@ -1,8 +1,9 @@ [ - ['name' => 'page#main', 'url' => '/', 'verb' => 'GET'], - ['name' => 'page#zipDrop', 'url' => '/zipDrop', 'verb' => 'GET'], - ['name' => 'page#getFile', 'url' => '/getFile', 'verb' => 'GET'] - ] + 'routes' => [ + ['name' => 'page#main', 'url' => '/', 'verb' => 'GET'], + ['name' => 'page#zipDrop', 'url' => '/zipDrop', 'verb' => 'GET'], + ['name' => 'page#getFile', 'url' => '/getFile', 'verb' => 'GET'], + ['name' => 'page#getFileMetadata', 'url' => '/getFileMetadata', 'verb' => 'GET'] + ] ]; diff --git a/lib/Controller/PageController.php b/lib/Controller/PageController.php index fb64af2..668ec55 100644 --- a/lib/Controller/PageController.php +++ b/lib/Controller/PageController.php @@ -134,4 +134,97 @@ class PageController extends Controller { return new JsonResponse(['parameters' => $parameters, 'status' => 500]); // 500 Internal Server Error } } -} \ No newline at end of file + + // Nouvelle méthode pour récupérer les métadonnées du fichier + #[NoCSRFRequired] + #[NoAdminRequired] + #[OpenAPI(OpenAPI::SCOPE_IGNORE)] + #[FrontpageRoute(verb: 'GET', url: '/getFileMetadata')] + public function getFileMetadata(): JsonResponse { + $zipUrl = $this->request->getParam('url'); + + // Initialiser les paramètres de réponse + $parameters = [ + 'status' => 'error', + 'message' => '', + 'filename' => null, + 'mime' => null, + 'size' => null + ]; + + // Valider l'URL + if (!$zipUrl || filter_var($zipUrl, FILTER_VALIDATE_URL) === false) { + $parameters['message'] = 'Invalid URL'; + return new JsonResponse(['parameters' => $parameters], 400); + } + + try { + // Initialiser cURL pour une requête HEAD + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $zipUrl); + curl_setopt($ch, CURLOPT_HEADER, true); // Récupérer les en-têtes + curl_setopt($ch, CURLOPT_NOBODY, true); // Requête HEAD (pas de corps) + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT, 10); + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); + + // Exécuter la requête HEAD + $headerResponse = curl_exec($ch); + + // Gérer les erreurs cURL + if (curl_errno($ch)) { + $parameters['message'] = 'cURL error: ' . curl_error($ch); + curl_close($ch); + return new JsonResponse(['parameters' => $parameters], 500); + } + + // Récupérer le code HTTP + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + curl_close($ch); + + if ($httpCode !== 200) { + $parameters['message'] = "HTTP error: $httpCode"; + return new JsonResponse(['parameters' => $parameters], $httpCode); + } + + // Extraire Content-Disposition depuis les en-têtes + $contentDisposition = ''; + if (preg_match('/Content-Disposition: (.+)/i', $headerResponse, $matches)) { + $contentDisposition = $matches[1]; + } + + // Extraire le nom du fichier depuis Content-Disposition + $filename = basename(parse_url($zipUrl, PHP_URL_PATH)); // Nom par défaut + if ($contentDisposition) { + preg_match('/filename="?([^"]+)"?/i', $contentDisposition, $filenameMatches); + if (!empty($filenameMatches[1])) { + $filename = $filenameMatches[1]; + } + } + + // Extraire d'autres métadonnées (optionnel) + $contentType = ''; + if (preg_match('/Content-Type: (.+)/i', $headerResponse, $typeMatches)) { + $contentType = $typeMatches[1]; + } + + $contentLength = 0; + if (preg_match('/Content-Length: (\d+)/i', $headerResponse, $lengthMatches)) { + $contentLength = (int)$lengthMatches[1]; + } + + // Construire la réponse de succès + $parameters['status'] = 'success'; + $parameters['message'] = 'Metadata retrieved successfully'; + $parameters['filename'] = $filename; + $parameters['mime'] = $contentType; + $parameters['size'] = $contentLength; + + return new JsonResponse(['parameters' => $parameters], 200); + + } catch (\Exception $e) { + $parameters['message'] = 'Exception: ' . $e->getMessage(); + return new JsonResponse(['parameters' => $parameters], 500); + } + } +} diff --git a/src/App.vue b/src/App.vue index 85519f5..f715bef 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,18 +1,53 @@ @@ -35,30 +70,78 @@ export default { name: 'App', components: { FileTable, - WebContentViewer + WebContentViewer }, data() { let zipUrl = document.getElementById('archiveInfos').getAttribute('dataarchiveurl'); - //console.log(zipUrl) return { zipUrl, sharedFile: null, dragEnded: false, + // Nouveaux champs pour le mode test + isTestMode: false, + testUrl: '', + testResults: '', }; }, - methods: { - handleFileUpload(file) { - this.sharedFile = file; - }, - toggleDragEnded(){ - this.dragEnded = !this.dragEnded; - this.sharedFile = null; - }, - translate(id) { - return i18next.t(id) - }, - }, -} + mounted() { + // Vérifier si l'URL contient ?test=true +const urlParams = new URLSearchParams(window.location.search); +this.isTestMode = urlParams.get('test') === 'true'; +}, +methods: { + handleFileUpload(file) { + this.sharedFile = file; + }, + toggleDragEnded() { + this.dragEnded = !this.dragEnded; + this.sharedFile = null; + }, + translate(id) { + return i18next.t(id); + }, + // Nouvelle méthode pour exécuter les tests + async runTest() { + if (!this.testUrl) { + this.testResults = "❌ Veuillez entrer une URL de test."; + return; + } + + try { + this.testResults = "⏳ Test en cours..."; + + // Tester la fonction getFilenameFromUrl + const filename = await this.getFilenameFromUrl(this.testUrl); + this.testResults = `✅ Nom2 du fichier extrait : ${filename}\n\n`; + + // Tester la fonction loadZipContent (si applicable) + // Note: Vous pouvez adapter cette partie pour tester d'autres fonctions + // this.testResults += `Contenu chargé : ${JSON.stringify(this.zipContent, null, 2)}`; + + } catch (error) { + this.testResults = `❌ Erreur : ${error.message}`; + console.error("Erreur lors du test :", error); + } + }, + // Fonction pour extraire le nom du fichier depuis une URL + async getFilenameFromUrl(fileUrl) { + try { + const metadataUrl = OC.generateUrl('/apps/webtransfer/getFileMetadata?url=' + encodeURIComponent(fileUrl)); + const metadataResponse = await fetch(metadataUrl); + const metadataJson = await metadataResponse.json(); + + const originalFileName = metadataJson.parameters.filename; + console.log("Nom du fichier :", originalFileName); + + return "originalFileName: " + originalFileName + " json:" + metadataJson; + + } catch (error) { + console.error("Erreur dans getFilenameFromUrl :", error); + return "erreur" + error; //fileUrl.split('/').pop(); + } + } +}, +}; \ No newline at end of file +