Cargar archivos desde el cliente de Java a un servidor HTTP

Me gustaría subir algunos archivos a un servidor HTTP. Básicamente, lo que necesito es una especie de solicitud POST al servidor con algunos parámetros y los archivos. He visto ejemplos de solo cargar archivos, pero no encontré cómo pasar parámetros adicionales.

¿Cuál es la solución más simple y gratuita de hacer esto? ¿Alguien tiene algún ejemplo de carga de archivos que yo pueda estudiar? He estado buscando en Google por unas horas, pero (tal vez es uno de esos días) no pude encontrar exactamente lo que necesitaba. La mejor solución sería algo que no involucre clases o bibliotecas de terceros.

Normalmente usará java.net.URLConnection para java.net.URLConnection las solicitudes HTTP. También normalmente usaría encoding multipart/form-data para contenido mixto POST (datos binarios y de caracteres). Haga clic en el enlace, contiene información y un ejemplo de cómo redactar un cuerpo de solicitud de multipart/form-data . La especificación se describe con más detalle en RFC2388 .

Aquí hay un ejemplo de inicio:

 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()); // Just generate some unique random value. String CRLF = "\r\n"; // Line separator required by multipart/form-data. 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); // Text file itself must be saved in this charset! writer.append(CRLF).flush(); Files.copy(textFile.toPath(), output); output.flush(); // Important before continuing with writer! writer.append(CRLF).flush(); // CRLF is important! It indicates end of boundary. // 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(); // 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 = ((HttpURLConnection) connection).getResponseCode(); System.out.println(responseCode); // Should be 200 

Este código es menos detallado cuando utiliza una biblioteca de terceros como Apache Commons HttpComponents Client .

Apache Commons FileUpload como algunos sugieren incorrectamente aquí solo es de interés en el lado del servidor . No puede usar y no lo necesita en el lado del cliente.

Ver también

  • Usando java.net.URLConnection para disparar y manejar solicitudes HTTP

Así es como lo haría con Apache HttpClient (esta solución es para aquellos a quienes no les importa usar una biblioteca de terceros):

  MultipartEntity entity = new MultipartEntity(); entity.addPart("file", new FileBody(file)); HttpPost request = new HttpPost(url); request.setEntity(entity); HttpClient client = new DefaultHttpClient(); HttpResponse response = client.execute(request); 

haga clic en el enlace Obtener archivo de ejemplo cargue clint java con apache HttpComponents

http://hc.apache.org/httpcomponents-client-ga/httpmime/examples/org/apache/http/examples/entity/mime/ClientMultipartFormPost.java

y enlace downalod de la biblioteca

https://hc.apache.org/downloads.cgi

use 4.5.3.zip, funciona bien en mi código

y mi código de trabajo …

 import java.io.File; import org.apache.http.HttpEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.ContentType; import org.apache.http.entity.mime.MultipartEntityBuilder; import org.apache.http.entity.mime.content.FileBody; import org.apache.http.entity.mime.content.StringBody; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; public class ClientMultipartFormPost { public static void main(String[] args) throws Exception { CloseableHttpClient httpclient = HttpClients.createDefault(); try { HttpPost httppost = new HttpPost("http://localhost:8080/MyWebSite1/UploadDownloadFileServlet"); FileBody bin = new FileBody(new File("E:\\meter.jpg")); StringBody comment = new StringBody("A binary file of some kind", ContentType.TEXT_PLAIN); HttpEntity reqEntity = MultipartEntityBuilder.create() .addPart("bin", bin) .addPart("comment", comment) .build(); httppost.setEntity(reqEntity); System.out.println("executing request " + httppost.getRequestLine()); CloseableHttpResponse response = httpclient.execute(httppost); try { System.out.println("----------------------------------------"); System.out.println(response.getStatusLine()); HttpEntity resEntity = response.getEntity(); if (resEntity != null) { System.out.println("Response content length: " + resEntity.getContentLength()); } EntityUtils.consume(resEntity); } finally { response.close(); } } finally { httpclient.close(); } } } 
 public static String simSearchByImgURL(int catid ,String imgurl) throws IOException{ CloseableHttpClient httpClient = HttpClients.createDefault(); CloseableHttpResponse response = null; String result =null; try { HttpPost httppost = new HttpPost("http://api0.visualsearchapi.com:8084/vsearchtech/api/v1.0/apisim_search"); StringBody catidBody = new StringBody(catid+"" , ContentType.TEXT_PLAIN); StringBody keyBody = new StringBody(APPKEY , ContentType.TEXT_PLAIN); StringBody langBody = new StringBody(LANG , ContentType.TEXT_PLAIN); StringBody fmtBody = new StringBody(FMT , ContentType.TEXT_PLAIN); StringBody imgurlBody = new StringBody(imgurl , ContentType.TEXT_PLAIN); MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.addPart("apikey", keyBody).addPart("catid", catidBody) .addPart("lang", langBody) .addPart("fmt", fmtBody) .addPart("imgurl", imgurlBody); HttpEntity reqEntity = builder.build(); httppost.setEntity(reqEntity); response = httpClient.execute(httppost); HttpEntity resEntity = response.getEntity(); if (resEntity != null) { // result = ConvertStreamToString(resEntity.getContent(), "UTF-8"); String charset = "UTF-8"; String content=EntityUtils.toString(response.getEntity(), charset); System.out.println(content); } EntityUtils.consume(resEntity); }catch(Exception e){ e.printStackTrace(); }finally { response.close(); httpClient.close(); } return result; } 
 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { boolean isMultipart = ServletFileUpload.isMultipartContent(request); if (!isMultipart) { return; } DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setSizeThreshold(MAX_MEMORY_SIZE); factory.setRepository(new File(System.getProperty("java.io.tmpdir"))); String uploadFolder = getServletContext().getRealPath("") + File.separator + DATA_DIRECTORY;//DATA_DIRECTORY is directory where you upload this file on the server ServletFileUpload upload = new ServletFileUpload(factory); upload.setSizeMax(MAX_REQUEST_SIZE);//MAX_REQUEST_SIZE is the size which size you prefer 

Y use

y use en el html

Podría depender de tu marco. (para cada uno de ellos podría existir una solución más fácil).

Pero para responder a su pregunta: hay muchas bibliotecas externas para esta funcionalidad. Mire aquí cómo usar la carga de archivos de apache commons.