Transfert de fichiers avec une application client/serveur HTTP


Contenu du snippet

Petit code d'introduction aux classes HttpServer et HttpClient en prenant pour exemple le transfert de fichiers.

Le serveur pourra être interrogé de deux manières :
  • POST http://localhost:8080/monFichier → pour envoyer le fichier "monFichier" sur le serveur
  • GET http://localhost:8080/monFichier → pour récupérer le fichier "monFichier" du serveur

Exemple de code serveur, qui utilise le répertoire D:/server pour enregistrer les fichiers reçus :
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.file.*;
import com.sun.net.httpserver.*;

public class Server {
    public static void main(String[] args) throws IOException {
        var server = HttpServer.create(new InetSocketAddress(8080), 0);
        server.createContext("/").setHandler(Server::handleRequest);
        server.start();
        System.out.println("Server: started");
    }
    
    private static void handleRequest(HttpExchange exchange) throws IOException {
        var serverPath = Paths.get("D:/server/", exchange.getRequestURI().getPath());
        
        switch (exchange.getRequestMethod()) {
        case "POST":
            Files.copy(exchange.getRequestBody(), serverPath, StandardCopyOption.REPLACE_EXISTING);
            exchange.sendResponseHeaders(200, 0);
            System.out.println("Server: file uploaded");
            break;
        
        case "GET":
            if (serverPath.toFile().isFile()) {
                exchange.sendResponseHeaders(200, serverPath.toFile().length());
                Files.copy(serverPath, exchange.getResponseBody());
                System.out.println("Server: file downloaded");
            } else {
                exchange.sendResponseHeaders(404, 0);
                System.out.println("Server: file not found");
            }
            break;
        }
        exchange.getResponseBody().close();
    }
}

Exemple de code client qui envoie le fichier D:/client/test.jpg sur le serveur, puis le récupère et l'enregistre sur D:/client/test2.jpg :
import java.net.URI;
import java.net.http.*;
import java.net.http.HttpRequest.BodyPublishers;
import java.net.http.HttpResponse.BodyHandlers;
import java.nio.file.Paths;

public class Client {
    public static void main(String[] args) throws Exception {
        var serverUri = URI.create("http://localhost:8080/toto.jpg");
        
        HttpClient.newHttpClient().send(
                HttpRequest.newBuilder()
                        .uri(serverUri)
                        .POST(BodyPublishers.ofFile(Paths.get("D:/client/test.jpg")))
                        .build(),
                BodyHandlers.discarding());
        System.out.println("Client: file uploaded");
        
        HttpClient.newHttpClient().send(
                HttpRequest.newBuilder()
                        .uri(serverUri)
                        .GET()
                        .build(),
                BodyHandlers.ofFile(Paths.get("D:/client/test2.jpg")));
        System.out.println("Client: file downloaded");
    }
}

Remarque : comme le serveur est appelé via l'URL http://localhost:8080/toto.jpg le fichier côté serveur sera enregistré sur D:/server/toto.jpg

Compatibilité : 1

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.