Maison  >  Article  >  Java  >  Comment télécharger des fichiers avec des paramètres supplémentaires à partir d'un client Java à l'aide de l'encodage « multipart/form-data » sans bibliothèques tierces ?

Comment télécharger des fichiers avec des paramètres supplémentaires à partir d'un client Java à l'aide de l'encodage « multipart/form-data » sans bibliothèques tierces ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-25 05:39:29527parcourir

How to Upload Files with Additional Parameters from a Java Client Using `multipart/form-data` Encoding Without Third-Party Libraries?

Téléchargement de fichiers avec des paramètres supplémentaires d'un client Java vers un serveur HTTP

Dans le but de télécharger des fichiers avec des paramètres supplémentaires d'un client Java vers un serveur HTTP, explorons un scénario et sa solution.

Imaginez que vous souhaitiez transmettre un fichier et un paramètre appelé "nom d'utilisateur" à un serveur. Comment y parviendriez-vous en utilisant une requête POST avec un encodage multipart/form-data ?

Pour que les choses restent simples, évitons les bibliothèques tierces et comptons sur les outils intégrés de Java.

<code class="java">import java.io.File;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.URLConnection;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Scanner;

public class HttpFileUploadWithParameters {

    private static final String BOUNDARY = Long.toHexString(System.currentTimeMillis());
    private static final String CRLF = "\r\n";
    private static final String CHARSET = "UTF-8";

    public static void main(String[] args) throws Exception {
        String url = "http://example.com/upload";

        File file = new File("/path/to/file.txt");
        String parameter = "value";

        URLConnection connection = new URL(url).openConnection();
        connection.setDoOutput(true);
        connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);

        try (OutputStream output = connection.getOutputStream();
             PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, CHARSET), true)) {

            // Write parameter
            writer.append("--" + BOUNDARY).append(CRLF);
            writer.append("Content-Disposition: form-data; name=\"parameter\"").append(CRLF);
            writer.append("Content-Type: text/plain; charset=" + CHARSET).append(CRLF);
            writer.append(CRLF).append(parameter).append(CRLF).flush();

            // Write file
            writer.append("--" + BOUNDARY).append(CRLF);
            writer.append("Content-Disposition: form-data; name=\"file\"; filename=\"" + file.getName() + "\"").append(CRLF);
            writer.append("Content-Type: application/octet-stream").append(CRLF);
            writer.append(CRLF).flush();
            Files.copy(file.toPath(), output);
            output.flush(); // Important before continuing with writer!
            writer.append(CRLF).flush(); // CRLF is important! It indicates end of boundary.

            // End of multipart/form-data.
            writer.append("--" + BOUNDARY + "--").append(CRLF).flush();
        }

        // Request is lazily fired whenever you need to obtain information about response.
        int responseCode = ((java.net.HttpURLConnection) connection).getResponseCode();
        System.out.println(responseCode); // Should be 200
    }
}</code>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn