Carica i file dal client Java a un server HTTP

Mi piacerebbe caricare alcuni file su un server HTTP. Fondamentalmente ciò di cui ho bisogno è una sorta di richiesta POST al server con alcuni parametri e i file. Ho visto esempi di solo caricamento di file, ma non ho trovato come passare anche parametri aggiuntivi.

Qual è la soluzione più semplice e gratuita per farlo? Qualcuno ha qualche esempio di caricamento di file che potrei studiare? Sono stato su Google per un paio d’ore, ma (forse è solo uno di quei giorni) non riuscivo a trovare esattamente quello di cui avevo bisogno. La soluzione migliore sarebbe qualcosa che non coinvolge classi o librerie di terze parti.

Normalmente dovresti usare java.net.URLConnection per far fuoco sulle richieste HTTP. Normalmente multipart/form-data codifica multipart/form-data per contenuti POST misti (dati binari e di carattere). Fare clic sul collegamento, contiene informazioni e un esempio su come comporre un corpo di richiesta multipart/form-data . La specifica è più in dettaglio descritta nella RFC2388 .

Ecco un esempio di kickoff:

 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 

Questo codice è meno dettagliato quando si utilizza una libreria di terze parti come Apache Commons HttpComponents Client .

Il FileUpload di Apache Commons come suggerito erroneamente qui è solo di interesse per il lato server . Non puoi usare e non ne hai bisogno dal lato del cliente.

Guarda anche

  • Utilizzare java.net.URLConnection per triggersre e gestire le richieste HTTP

Ecco come lo faresti con Apache HttpClient (questa soluzione è per coloro che non si occupano di usare una libreria di terze parti):

  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); 

clicca link ottieni un esempio di file upload clint java con HttpComponents di apache

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

e libreria downalod link

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

usa 4.5.3.zip sta funzionando bene nel mio codice

e il mio codice di lavoro ..

 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 

E usa

e usa nell’html

Potrebbe dipendere dalla tua struttura. (per ognuno di essi potrebbe esistere una soluzione più semplice).

Ma per rispondere alla tua domanda: ci sono molte librerie esterne per questa funzionalità. Guarda qui come usare apache commons fileupload.