Uploading files from a Java client to an HTTP server

I want to upload multiple files to an HTTP server. Basically I need some kind of POST request to the server with several parameters and files. I saw examples of just downloading files, but did not find how to pass additional parameters.

What is the easiest and most free solution? Does anyone have examples of file uploads that I could learn? I searched the Internet for several hours, but (perhaps this is only one of those days) I could not find what I needed. A better solution would be that it does not imply any third-party classes or libraries.

+63
java urlconnection file-upload
Mar 18
source share
7 answers

Usually you use java.net.URLConnection to start HTTP requests. You also typically use multipart/form-data encoding for mixed POST content (binary and character data). Click the link, it contains information and an example of how to compose the request body multipart/form-data . The specification is described in more detail in RFC2388 .

Here is an example run:

 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 

This code is less verbose if you use a third-party library, such as the Apache Commons HttpComponents Client .

Apache Commons FileUpload , as some incorrectly suggest here, is of interest only to the server side . You cannot use and do not need it on the client side.

see also

+93
Mar 18 '10 at 12:00
source

Here's how you could do it with Apache HttpClient (this solution is for those who are not against using a third-party library):

  HttpEntity entity = MultipartEntityBuilder.create() .addPart("file", new FileBody(file)) .build(); HttpPost request = new HttpPost(url); request.setEntity(entity); HttpClient client = HttpClientBuilder.create().build(); HttpResponse response = client.execute(request); 
+31
06 Sep '13 at 9:59 on
source

click the link get an example upload clint java file with apache HttpComponents

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

and downalod link library

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

use 4.5.3.zip, it works fine in my code

and my working code.

 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(); } } } 
+5
Mar 02 '17 at 13:07 on
source
 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; } 
0
Sep 04 '16 at 11:19
source
 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 

And use <form enctype="multipart/form-data"> and use <input type="file"> in html

-3
Mar 14 '14 at 7:36
source

Here is one way to do this: http://commons.apache.org/fileupload/ . You can look into the sources if you want.

-four
Mar 18 '10 at 11:40
source

It may depend on your structure. (for each of them there could be an easier solution).

But the answer to your question is: there are many external libraries for this function. See here how to use the apache commons fileupload file.

-6
Mar 18 '10 at 11:52
source



All Articles