Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Upload files from Java client to a HTTP server

I'd like to upload a few files to a HTTP server. Basically what I need is some sort of a POST request to the server with a few parameters and the files. I've seen examples of just uploading files, but didn't find how to also pass additional parameters.

What's the simplest and free solution of doing this? Does anyone have any file upload examples that I could study? I've been googling for a few hours, but (maybe it's just one of those days) couldn't find exactly what I needed. The best solution would be something that doesn't involve any third party classes or libraries.

like image 284
Marius Avatar asked Mar 18 '10 11:03

Marius


People also ask

How do you upload a file into a Web server in Java?

Java file uploads From the form, invoke a Java Servlet to handle the server-side processing of the file; Code a Java Servlet to handle the file upload process; Annotate the file upload Servlet with the @MultipartConfig annotation; In the Servlet, save the uploaded file to the server's file system; and.


1 Answers

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

Here's a kickoff example:

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 when you use a 3rd party library like Apache Commons HttpComponents Client.

The Apache Commons FileUpload as some incorrectly suggest here is only of interest in the server side. You can't use and don't need it at the client side.

See also

  • Using java.net.URLConnection to fire and handle HTTP requests
like image 122
BalusC Avatar answered Sep 20 '22 15:09

BalusC