"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo cargar archivos y parámetros adicionales a un servidor HTTP usando java.net.URLConnection?

¿Cómo cargar archivos y parámetros adicionales a un servidor HTTP usando java.net.URLConnection?

Publicado el 2024-11-07
Navegar:940

How to upload files and additional parameters to an HTTP server using java.net.URLConnection?

Cargar archivos a un servidor HTTP con parámetros adicionales en Java

Cargar archivos a un servidor HTTP es una necesidad común para muchas aplicaciones. Sin embargo, a veces también es necesario pasar parámetros adicionales junto con los archivos. Aquí hay una solución que le permite enviar archivos y parámetros sin usar bibliotecas externas:

java.net.URLConnection y Multipart/Form-Data

Para enviar archivos y parámetros, utilizará java.net.URLConnection y empleará codificación de datos de formulario/multiparte. Multipart/form-data le permite mezclar datos binarios (archivos) y datos de caracteres (parámetros) en una sola solicitud HTTP.

Código de ejemplo:

String url = "http://example.com/upload";
String charset = "UTF-8";
String param = "value";
File textFile = new File("/path/to/file.txt");
File binaryFile = new File("/path/to/file.bin");
String boundary = Long.toHexString(System.currentTimeMillis());
String CRLF = "\r\n";

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);
) {
    // Send normal param.
    writer.append("--"   boundary).append(CRLF);
    writer.append("Content-Disposition: form-data; name=\"param\"").append(CRLF);
    writer.append("Content-Type: text/plain; charset="   charset).append(CRLF);
    writer.append(CRLF).append(param).append(CRLF).flush();

    // Send text file.
    writer.append("--"   boundary).append(CRLF);
    writer.append("Content-Disposition: form-data; name=\"textFile\"; filename=\""   textFile.getName()   "\"").append(CRLF);
    writer.append("Content-Type: text/plain; charset="   charset).append(CRLF);
    writer.append(CRLF).flush();
    Files.copy(textFile.toPath(), output);
    output.flush(); 
    writer.append(CRLF).flush();

    // Send binary file.
    writer.append("--"   boundary).append(CRLF);
    writer.append("Content-Disposition: form-data; name=\"binaryFile\"; filename=\""   binaryFile.getName()   "\"").append(CRLF);
    writer.append("Content-Type: "   URLConnection.guessContentTypeFromName(binaryFile.getName())).append(CRLF);
    writer.append("Content-Transfer-Encoding: binary").append(CRLF);
    writer.append(CRLF).flush();
    Files.copy(binaryFile.toPath(), output);
    output.flush(); 
    writer.append(CRLF).flush();

    // 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 = ((HttpURLConnection) connection).getResponseCode();
System.out.println(responseCode); 

Notas adicionales:

  • Asegúrese de proporcionar un valor de límite único para cada solicitud de varias partes.
  • Los archivos deben estar en el conjunto de caracteres especificado cuando enviando el encabezado Content-Type.
  • Apache Commons HttpComponents Client puede agilizar aún más el proceso, pero no es necesario.

Referencia:

  • [Uso de java.net.URLConnection para activar y manejar solicitudes HTTP](https://docs.oracle.com/javase/tutorial/networking/urls/creating-urls.html)
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3