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

首頁 > 學院 > 開發設計 > 正文

Upload file to servlet without using HTML form

2019-11-11 00:51:54
字體:
來源:轉載
供稿:網友
It’s trivial to use a web form which is made by HTML code for uploading files from web browser to a server. This is commonly referred asform based file upload, and typically suitable for web-based applications. How about standalone or command line-based applications – which sometimes need to upload files to a web server but cannot use an upload form in HTML? Well, this article is going to answer that question by implementing the following solution:Server: uses a java servlet for receiving file uploaded from client and saves it into a file on server’s disk.Client: is a command line based PRogram that sends an HTTP POST request along with file’s binary data to the servlet.We can call this method as non-form based file upload. Keep in mind that, this is not FTP upload, because it is still using HTTP protocol for transmitting the file. Let’s examine how each part is implemented.

Coding the servlet

Write a Java servlet as follows:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162package net.codejava.servlet; import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.util.Enumeration; import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse; /** * This servlet demonstrates how to receive file uploaded from the client * without using third-party upload library such as Commons File Upload. * @author www.codejava.net */public class ReceiveFileServlet extendsHttpServlet {    staticfinal String SAVE_DIR ="E:/Test/Upload/";    staticfinal int BUFFER_SIZE = 4096;         protectedvoid doPost(HttpServletRequest request,            HttpServletResponse response)throws ServletException, IOException {                 // Gets file name for HTTP header        String fileName = request.getHeader("fileName");        File saveFile =new File(SAVE_DIR + fileName);                 // prints out all header values        System.out.println("===== Begin headers =====");        Enumeration<String> names = request.getHeaderNames();        while(names.hasMoreElements()) {            String headerName = names.nextElement();            System.out.println(headerName +" = " + request.getHeader(headerName));                }        System.out.println("===== End headers =====/n");                 // opens input stream of the request for reading data        InputStream inputStream = request.getInputStream();                 // opens an output stream for writing file        FileOutputStream outputStream =new FileOutputStream(saveFile);                 byte[] buffer =new byte[BUFFER_SIZE];        intbytesRead = -1;        System.out.println("Receiving data...");                 while((bytesRead = inputStream.read(buffer)) != -1) {            outputStream.write(buffer,0, bytesRead);        }                 System.out.println("Data received.");        outputStream.close();        inputStream.close();                 System.out.println("File written to: "+ saveFile.getAbsolutePath());                 // sends response to client        response.getWriter().print("UPLOAD DONE");    }}
This servlet handles HTTP POST requests in its doPost() method. There are some important points here in this code:Name of the upload file is retrieved from a HTTP header named as “fileName” – this header is set by the client.We create a saveFile object in order to save the upload file into disk. Its path is constructed from theSAVE_DIR constant and the fileName header. A FileOutputStream object wraps this saveFile to write byte arrays into the file.The most important point is to open an InputStream from the HttpServletRequest in order to read bytes transferred from the client.We use a while loop to repeatedly read byte arrays from the request’s input stream and write them into thesaveFile’s output stream. This is trivial.And finally, always close the opened input stream and output stream, then send a response to the client (in this case, a simple text message “UPLOAD DONE”).Now let’s examine how the client is implemented.  Head First Servlets and jsp [Kindle version] - This book does not only help you interact with Servlets and JSPs quickly and deeply, it also helps you have a good preparation for the SCWCD/OCPJWCD. Read this book if you want to get certified.

Coding the client program

Following is code of the client program:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667import 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.net.HttpURLConnection;import java.net.URL; /** * This program demonstrates how to upload files to a web server * using HTTP POST request without any HTML form. * @author www.codejava.net * */public class NonFormFileUploader {    staticfinal String UPLOAD_URL ="http://localhost:8080/CodeWeb/ReceiveFileServlet";    staticfinal int BUFFER_SIZE = 4096;     publicstatic void main(String[] args) throws IOException {        // takes file path from first program's argument        String filePath = args[0];        File uploadFile =new File(filePath);         System.out.println("File to upload: "+ filePath);         // creates a HTTP connection        URL url =new URL(UPLOAD_URL);        HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();        httpConn.setUseCaches(false);        httpConn.setDoOutput(true);        httpConn.setRequestMethod("POST");        // sets file name as a HTTP header        httpConn.setRequestProperty("fileName", uploadFile.getName());         // opens output stream of the HTTP connection for writing data        OutputStream outputStream = httpConn.getOutputStream();         // Opens input stream of the file for reading data        FileInputStream inputStream =new FileInputStream(uploadFile);         byte[] buffer =new byte[BUFFER_SIZE];        intbytesRead = -1;         System.out.println("Start writing data...");         while((bytesRead = inputStream.read(buffer)) != -1) {            outputStream.write(buffer,0, bytesRead);        }         System.out.println("Data was written.");        outputStream.close();        inputStream.close();         // always check HTTP response code from server        intresponseCode = httpConn.getResponseCode();        if(responseCode == HttpURLConnection.HTTP_OK) {            // reads server's response            BufferedReader reader =new BufferedReader(newInputStreamReader(                    httpConn.getInputStream()));            String response = reader.readLine();            System.out.println("Server's response: "+ response);        }else {            System.out.println("Server returned non-OK code: "+ responseCode);        }    }}

The important point here is we use an HttpURLConnection object to send an HTTP POST request to the server at URL of the servlet (identified by the constantUPLOAD_URL) and open the OutputStream of this connection to write byte arrays of the upload file. Path of this file is passed as the first argument of the program. Similarly to the servlet, we use a while loop to read/write byte arrays from/to the file’s input stream/request’s output stream. Finally, we read response from the server after closing both input/output streams by using the input stream of the request.

Testing the application

Deploy the ReceiveFileServlet on a servlet container like Tomcat and start the server. Then run the client program by executing the following command:

java NonFormFileUploader e:/Test/RecordAudio.wav

Here we pass a WAV audio file to be uploaded. The server will produce some output as the following screenshot:server output From this log, we can examine values of all HTTP headers sent from the client. Almost of values are set by Java automatically, except thefilename is set from the client manually. And here is the output from the client program:client output  NOTE:Neither the server nor the client is playing with multipart request (which is standard for form-based upload). Note that the request’s content type is set toapplication/x-www-form-urlencoded instead of multipart/form-data.Thus the client program cannot be applied for the server which accepts multipart request. The server side must be implemented like theReceiveFileServletdoes.
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 琼海市| 西丰县| 邢台市| 安塞县| 广昌县| 留坝县| 浏阳市| 博客| 宜黄县| 汝州市| 甘德县| 四子王旗| 临泉县| 海原县| 中方县| 驻马店市| 新津县| 临高县| 陵水| 大英县| 乌海市| 剑川县| 宿迁市| 策勒县| 长宁区| 镇原县| 沙田区| 富蕴县| 蒲城县| 全南县| 巨野县| 慈溪市| 五大连池市| 叙永县| 遂川县| 手机| 康保县| 讷河市| 理塘县| 万山特区| 股票|