| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 | package net.codejava.networking; import java.io.BufferedReader; import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.net.HttpURLConnection;import java.net.URL;import java.net.URLConnection;import java.util.ArrayList;import java.util.List; /** * This utility class provides an abstraction layer for sending multipart HTTP * POST requests to a web server. * @author www.codejava.net * */public class MultipartUtility { privatefinal String boundary; privatestatic final String LINE_FEED = "/r/n"; privateHttpURLConnection httpConn; privateString charset; privateOutputStream outputStream; privatePrintWriter writer; /** * This constructor initializes a new HTTP POST request with content type * is set to multipart/form-data * @param requestURL * @param charset * @throws IOException */ publicMultipartUtility(String requestURL, String charset) throwsIOException { this.charset = charset; // creates a unique boundary based on time stamp boundary ="===" + System.currentTimeMillis() +"==="; URL url =new URL(requestURL); httpConn = (HttpURLConnection) url.openConnection(); httpConn.setUseCaches(false); httpConn.setDoOutput(true);// indicates POST method httpConn.setDoInput(true); httpConn.setRequestProperty("Content-Type", "multipart/form-data; boundary="+ boundary); httpConn.setRequestProperty("User-Agent","CodeJava Agent"); httpConn.setRequestProperty("Test","Bonjour"); outputStream = httpConn.getOutputStream(); writer =new PrintWriter(newOutputStreamWriter(outputStream, charset), true); } /** * Adds a form field to the request * @param name field name * @param value field value */ publicvoid addFormField(String name, String value) { writer.append("--"+ boundary).append(LINE_FEED); writer.append("Content-Disposition: form-data; name=/""+ name + "/"") .append(LINE_FEED); writer.append("Content-Type: text/plain; charset="+ charset).append( LINE_FEED); writer.append(LINE_FEED); writer.append(value).append(LINE_FEED); writer.flush(); } /** * Adds a upload file section to the request * @param fieldName name attribute in <input type="file" name="..." /> * @param uploadFile a File to be uploaded * @throws IOException */ publicvoid addFilePart(String fieldName, File uploadFile) throwsIOException { String fileName = uploadFile.getName(); writer.append("--"+ boundary).append(LINE_FEED); writer.append( "Content-Disposition: form-data; name=/""+ fieldName +"/"; filename=/"" + fileName + "/"") .append(LINE_FEED); writer.append( "Content-Type: " + URLConnection.guessContentTypeFromName(fileName)) .append(LINE_FEED); writer.append("Content-Transfer-Encoding: binary").append(LINE_FEED); writer.append(LINE_FEED); writer.flush(); FileInputStream inputStream =new FileInputStream(uploadFile); byte[] buffer =new byte[4096]; intbytesRead = -1; while((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer,0, bytesRead); } outputStream.flush(); inputStream.close(); writer.append(LINE_FEED); writer.flush(); } /** * Adds a header field to the request. * @param name - name of the header field * @param value - value of the header field */ publicvoid addHeaderField(String name, String value) { writer.append(name +": " + value).append(LINE_FEED); writer.flush(); } /** * Completes the request and receives response from the server. * @return a list of Strings as response in case the server returned * status OK, otherwise an exception is thrown. * @throws IOException */ publicList<String> finish() throwsIOException { List<String> response =new ArrayList<String>(); writer.append(LINE_FEED).flush(); writer.append("--"+ boundary + "--").append(LINE_FEED); writer.close(); // checks server's status code first intstatus = httpConn.getResponseCode(); if(status == HttpURLConnection.HTTP_OK) { BufferedReader reader =new BufferedReader(newInputStreamReader( httpConn.getInputStream())); String line =null; while((line = reader.readLine()) != null) { response.add(line); } reader.close(); httpConn.disconnect(); }else { thrownew IOException("Server returned non-OK status: "+ status); } returnresponse; }} |
| 12345678910111213141516171819202122232425262728293031323334353637383940414243 | package net.codejava.networking; import java.io.File;import java.io.IOException;import java.util.List; /** * This program demonstrates a usage of the MultipartUtility class. * @author www.codejava.net * */public class MultipartFileUploader { publicstatic void main(String[] args) { String charset ="UTF-8"; File uploadFile1 =new File("e:/Test/PIC1.JPG"); File uploadFile2 =new File("e:/Test/PIC2.JPG"); String requestURL ="http://localhost:8080/FileUploadSpringMVC/uploadFile.do"; try{ MultipartUtility multipart =new MultipartUtility(requestURL, charset); multipart.addHeaderField("User-Agent","CodeJava"); multipart.addHeaderField("Test-Header","Header-Value"); multipart.addFormField("description","Cool Pictures"); multipart.addFormField("keyWords","Java,upload,Spring"); multipart.addFilePart("fileUpload", uploadFile1); multipart.addFilePart("fileUpload", uploadFile2); List<String> response = multipart.finish(); System.out.println("SERVER REPLIED:"); for(String line : response) { System.out.println(line); } }catch (IOException ex) { System.err.println(ex); } }} |
In this program, we connect to the servlet’s URL of the application FileUploadSpringMVC (see this tutorial:Upload files with Spring MVC):
http://localhost:8080/FileUploadSpringMVC/uploadFile.do
We added two header fields, two form fields and two upload files under the name “fileUpload” – which must match the fields declared in theupload form of the FileUploadSpringMVC application. When running the above program, it will produce the following output:
We can realize that the server’s response is actually HTML code of the application FileUploadSpringMVC’s result page. So far in this article, we’ve discussed about how to implement a command line program in Java which is capable of upload files to any URL that can handle multipart request, without implementing an HTML upload form. This would be very useful in case we want to upload files to a web server programmatically.新聞熱點
疑難解答