From d94d1ff61643c89caae306a2881b4485c9ddf732 Mon Sep 17 00:00:00 2001 From: Vandewaeter Fabio <fabio.vandewaeter.etu@univ-lille.fr> Date: Mon, 10 Mar 2025 12:17:50 +0100 Subject: [PATCH] =?UTF-8?q?save=20en=20train=20de=20corriger=20l'ambiguit?= =?UTF-8?q?=C3=A9=20des=20chemins?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/fil/sr2/flopbox/FTPResource.java | 147 +++++++----------- 1 file changed, 56 insertions(+), 91 deletions(-) diff --git a/src/main/java/fil/sr2/flopbox/FTPResource.java b/src/main/java/fil/sr2/flopbox/FTPResource.java index 3e54f33..a8a2f26 100644 --- a/src/main/java/fil/sr2/flopbox/FTPResource.java +++ b/src/main/java/fil/sr2/flopbox/FTPResource.java @@ -27,6 +27,62 @@ public class FTPResource { return Response.ok(servers).build(); } + @GET +@Path("/{alias}/{path: .+}") +public Response getFTPResource( + @PathParam("alias") String alias, + @PathParam("path") String path, + @HeaderParam("X-FTP-User") String user, + @HeaderParam("X-FTP-Pass") String pass) { + + FTPServerConfig config = FTPServerRepository.getInstance().getServer(alias); + if (config == null) { + return Response.status(Response.Status.NOT_FOUND) + .entity("Serveur FTP non trouvé").build(); + } + + FTPClient ftpClient = new FTPClient(); + try { + // Connexion et authentification FTP + ftpClient.connect(config.getHost(), config.getPort()); + if (!ftpClient.login(user, pass)) { + return Response.status(Response.Status.UNAUTHORIZED) + .entity("Authentification FTP échouée").build(); + } + ftpClient.enterLocalPassiveMode(); + ftpClient.setFileType(FTP.BINARY_FILE_TYPE); + + // Vérifier l'existence et le type de la ressource + FTPFile[] files = ftpClient.listFiles(path); + if (files == null || files.length == 0) { + return Response.status(Response.Status.NOT_FOUND) + .entity("Ressource non trouvée : " + path).build(); + } + FTPFile file = files[0]; + if (file.isDirectory()) { + // Si c'est un répertoire, renvoyer la liste des noms de fichiers/répertoires + String[] names = ftpClient.listNames(path); + ftpClient.logout(); + ftpClient.disconnect(); + return Response.ok(names).build(); + } else { + // Si c'est un fichier, renvoyer un flux binaire pour le téléchargement + InputStream is = ftpClient.retrieveFileStream(path); + if (is == null) { + return Response.status(Response.Status.INTERNAL_SERVER_ERROR) + .entity("Échec de la récupération du fichier").build(); + } + // On utilise ici une classe utilitaire pour fermer proprement le flux et la connexion FTP + return Response.ok(new InputStreamResource(is, ftpClient)) + .header("Content-Disposition", "attachment; filename=\"" + getFileName(path) + "\"") + .build(); + } + } catch (IOException e) { + return Response.status(Response.Status.INTERNAL_SERVER_ERROR) + .entity("Erreur FTP : " + e.getMessage()).build(); + } +} + // POST /ftps - enregistre un nouveau serveur FTP @POST @Consumes(MediaType.APPLICATION_JSON) @@ -43,42 +99,6 @@ public class FTPResource { return Response.created(builder.build()).entity(config).build(); } - // GET /ftps/{alias}/{path} - récupère le contenu d'un répertoire ou d'un - // fichier sur le serveur FTP - @GET - @Path("/{alias}/{path: .+}") - @Produces(MediaType.APPLICATION_JSON) - public Response getFTPContent( - @PathParam("alias") String alias, - @PathParam("path") String path, - @HeaderParam("X-FTP-User") String ftpUser, - @HeaderParam("X-FTP-Pass") String ftpPass) { - System.out.println("getFTPContent()"); - FTPServerConfig config = FTPServerRepository.getInstance().getServer(alias); - if (config == null) { - return Response.status(Response.Status.NOT_FOUND) - .entity("Alias de serveur FTP non trouvé").build(); - } - FTPClient ftpClient = new FTPClient(); - try { - ftpClient.connect(config.getHost(), config.getPort()); - boolean login = ftpClient.login(ftpUser, ftpPass); - if (!login) { - return Response.status(Response.Status.UNAUTHORIZED) - .entity("Échec de l'authentification FTP").build(); - } - // Pour cet exemple, on se place dans le répertoire demandé et on renvoie la - // liste des fichiers. - ftpClient.changeWorkingDirectory(path); - String[] files = ftpClient.listNames(); - ftpClient.logout(); - ftpClient.disconnect(); - return Response.ok(files).build(); - } catch (IOException ex) { - return Response.status(Response.Status.INTERNAL_SERVER_ERROR) - .entity("Erreur FTP : " + ex.getMessage()).build(); - } - } @DELETE @Path("/{alias}") @@ -97,61 +117,6 @@ public class FTPResource { return updated ? Response.ok(newConfig).build() : Response.status(Response.Status.NOT_FOUND).build(); } - @GET - @Path("/{alias}/{path: .+}") - @Produces(MediaType.APPLICATION_OCTET_STREAM) - public Response downloadFile( - @PathParam("alias") String alias, - @PathParam("path") String path, - @HeaderParam("X-FTP-User") String user, - @HeaderParam("X-FTP-Pass") String pass) { - - System.out.println("downloadFile()"); - FTPServerConfig config = FTPServerRepository.getInstance().getServer(alias); - if (config == null) { - return Response.status(Response.Status.NOT_FOUND) - .entity("Serveur FTP non trouvé").build(); - } - - FTPClient ftp = new FTPClient(); - - try { - // Connexion au serveur FTP - ftp.connect(config.getHost(), config.getPort()); - if (!ftp.login(user, pass)) { - return Response.status(Response.Status.UNAUTHORIZED) - .entity("Authentification FTP échouée").build(); - } - - // Configuration du transfert - ftp.enterLocalPassiveMode(); - ftp.setFileType(FTP.BINARY_FILE_TYPE); - - // Vérification de l'existence du fichier - FTPFile[] files = ftp.listFiles(path); - if (files.length == 0 || files[0].isDirectory()) { - return Response.status(Response.Status.NOT_FOUND) - .entity("Fichier non trouvé : " + path).build(); - } - - // Récupération du flux FTP - InputStream is = ftp.retrieveFileStream(path); - if (is == null) { - return Response.status(Response.Status.INTERNAL_SERVER_ERROR) - .entity("Échec de la récupération du fichier").build(); - } - - // Création de la réponse avec fermeture automatique des ressources - return Response.ok(new InputStreamResource(is, ftp)) - .header("Content-Disposition", "attachment; filename=\"" + getFileName(path) + "\"") - .build(); - - } catch (IOException e) { - return Response.status(Response.Status.INTERNAL_SERVER_ERROR) - .entity("Erreur FTP : " + e.getMessage()).build(); - } - } - // Classe utilitaire pour gérer le flux et fermer les ressources private static class InputStreamResource implements StreamingOutput { private final InputStream inputStream; -- GitLab