diff --git a/pom.xml b/pom.xml
index 9512a90d67ad8a303ba673eb634647852ed03a46..802954471a4931c42cef2e2d88a24415a4a8037f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -116,5 +116,7 @@
     <properties>
         <jersey.version>3.0.2</jersey.version>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <maven.compiler.release>17</maven.compiler.release>
     </properties>
+
 </project>
diff --git a/src/main/java/fil/sr2/flopbox/AuthFilter.java b/src/main/java/fil/sr2/flopbox/AuthFilter.java
index ce1d73817e9bbebb50d61ec70043e5b1f44fa8e6..89a8821a126a68e1eb710039a0dcc55fbfa16366 100644
--- a/src/main/java/fil/sr2/flopbox/AuthFilter.java
+++ b/src/main/java/fil/sr2/flopbox/AuthFilter.java
@@ -14,35 +14,6 @@ import jakarta.ws.rs.ext.Provider;
 public class AuthFilter implements ContainerRequestFilter {
     private static final Map<String, String> USERS = loadUsers();
 
-    /*
-     * @Override
-     * public void filter(ContainerRequestContext requestContext) throws IOException
-     * {
-     * // Récupération de l'en-tête Authorization (ex.
-     * "Bearer flopbox-secret-token")
-     * String authHeader =
-     * requestContext.getHeaderString(HttpHeaders.AUTHORIZATION);
-     * if (authHeader == null || !authHeader.startsWith("Bearer ")) {
-     * requestContext.abortWith(
-     * Response.status(Response.Status.UNAUTHORIZED)
-     * .entity("En-tête Authorization manquant ou invalide")
-     * .build());
-     * return;
-     * }
-     * String token = authHeader.substring("Bearer ".length());
-     * // Vérification du token (dans une implémentation réelle, vérification par
-     * // rapport à une liste de comptes stockés)
-     * if (!"flopbox-secret-token".equals(token)) {
-     * requestContext.abortWith(
-     * Response.status(Response.Status.UNAUTHORIZED)
-     * .entity("Token invalide")
-     * .build());
-     * return;
-     * }
-     * // Si le token est valide, la requête continue.
-     * }
-     */
-
     @Override
     public void filter(ContainerRequestContext ctx) throws IOException {
         String token = extractToken(ctx);
diff --git a/src/main/java/fil/sr2/flopbox/FTPResource.java b/src/main/java/fil/sr2/flopbox/FTPResource.java
index 7e199da20f28a15fddfa1cf599f63d3035a6cfb9..b81f0b3d6119247850f6b08a9a2608e5180a263b 100644
--- a/src/main/java/fil/sr2/flopbox/FTPResource.java
+++ b/src/main/java/fil/sr2/flopbox/FTPResource.java
@@ -2,14 +2,18 @@ package fil.sr2.flopbox;
 
 import jakarta.ws.rs.*;
 import jakarta.ws.rs.core.*;
+
+import java.io.Closeable;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.OutputStream;
 import java.net.SocketException;
 import java.net.URI;
 import java.util.List;
 
 import org.apache.commons.net.ftp.FTP;
 import org.apache.commons.net.ftp.FTPClient;
+import org.apache.commons.net.ftp.FTPFile;
 
 @Path("/ftps")
 public class FTPResource {
@@ -98,29 +102,74 @@ public class FTPResource {
             @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 ftp = new FTPClient();
+
         try {
+            // Connexion au serveur FTP
             ftp.connect(config.getHost(), config.getPort());
-            ftp.login(user, pass);
-            // path = "/home/m1gl/fabio.vandewaeter.etu/M1/SR2/serveur-ftp-test/" + path;
+            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("Could not retrieve file : " + path).build();
+                        .entity("Échec de la récupération du fichier").build();
             }
-            return Response.ok(is)
+
+            // 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).build();
-        } finally {
-            try {
-                if (ftp.isConnected()) {
-                    ftp.logout();
-                    ftp.disconnect();
+            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;
+        private final FTPClient ftpClient;
+
+        public InputStreamResource(InputStream inputStream, FTPClient ftpClient) {
+            this.inputStream = inputStream;
+            this.ftpClient = ftpClient;
+        }
+
+        @Override
+        public void write(OutputStream output) throws IOException, WebApplicationException {
+            try (inputStream) {
+                byte[] buffer = new byte[4096];
+                int bytesRead;
+                while ((bytesRead = inputStream.read(buffer)) != -1) {
+                    output.write(buffer, 0, bytesRead);
+                }
+            } finally {
+                if (ftpClient.isConnected()) {
+                    ftpClient.completePendingCommand();
+                    ftpClient.logout();
+                    ftpClient.disconnect();
                 }
-            } catch (IOException e) {
-                e.printStackTrace();
             }
         }
     }