国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Upload files by sending multipart request programmatically

2019-11-10 21:29:13
字體:
供稿:網(wǎng)友
In the article Upload file to servlet without using HTML form,we discussed how to fire an HTTP POST request to transfer a file to a server – but that request’s content type is not ofmultipart/form-data, so it may not work with the servers which handle multipart request and it requires both client and server are implemented in java. To overcome that limitation, in this article, we are going to discuss a different solution for uploading files from a Java client to any web server in a PRogrammatic way, without using upload form in HTML code. Let’s examine this interesting solution now.  

Coding multipart utility class

We build the utility class called MultipartUtility with the following code:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151package 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;    }}
  This utility class uses java.net.HttpURLConnection class and follows the RFC 1867 (Form-based File Upload in HTML) to make an HTTP POST request withmultipart/form-data content type in order to upload files to a given URL. It has one constructor and three methods:MultipartUtility(String requestURL, String charset): creates a new instance of this class for a given request URL and charset.voidaddFormField(String name, String value): adds a regular text field to the request.voidaddHeaderField(String name, String value): adds an HTTP header field to the request.voidaddFilePart(String fieldName, File uploadFile): attach a file to be uploaded to the request.List<String>finish(): this method must be invoked lastly to complete the request and receive response from server as a list of String.Now let’s take a look at an example of how to use this utility class.  

Coding a test program

Since the MultipartUtility class abstracts all the detailed implementation, a usage example would be pretty simple as shown in the following program:
12345678910111213141516171819202122232425262728293031323334353637383940414243package 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:server response 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.
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 清水河县| 方正县| 平南县| 江安县| 博乐市| 昌黎县| 卓资县| 香格里拉县| 柳州市| 蓬溪县| 开平市| 井研县| 灵石县| 安国市| 遂宁市| 九台市| 塘沽区| 云梦县| 平昌县| 海淀区| 松江区| 嘉义县| 丰镇市| 成都市| 滦南县| 景谷| 遂昌县| 乐东| 兴义市| 郯城县| 锡林郭勒盟| 宁明县| 松江区| 荆州市| 商河县| 安图县| 娱乐| 安龙县| 宁河县| 黄浦区| 静乐县|