2011年8月7日 星期日

Java 網路程式 - org.apache.commons.httpclient 傳送檔案給 Servlet

本篇介紹運用 apache commons 中的 httpClient 模擬一個 Http Post 的方法

關於 詳情可以看 RFC1867:

他同樣是運用 Form-based File Upload in HTML

將檔案送到一個 Servlet,在 Servlet 中運用 apache commons 的 fileUpload 執行存檔動作

以下為簡圖說明之











在 Client 端部分不限於 Servlet 裡,已下看看Client程式的sample

//.....
String targetPath = "C:\\test.doc";
String url = "http://localhost:7001/OfficeService/office/receiveFiles";  //Server 端的 Servlet Url
File targetFile = new File(targetPath);  //欲傳送之檔案

HttpClient client = new HttpClient();
MultipartPostMethod filePost = new MultipartPostMethod(targetUrl);  // 傳送檔案時運用 MultipartPostMethod 將目標URL傳入
try {
    if(!targetFile.exists()){
        throw new FileNotFoundException(targetFile.getPath() + " -- not found -- ");
    }else{
        filePost.addParameter("param1", new String("1"));  //寫入一個請求參數及其對應的值
        filePost.addParameter("param2", new String("2"));  //寫入一個請求參數及其對應的值
        filePost.addPart(new FilePart("uploadFile", targetFile));   //新增欲上傳的檔案
				
        client.getHttpConnectionManager().getParams().setConnectionTimeout(10000);  //設定逾期時間
				
        int status = client.executeMethod(filePost);   //執行 Request,並回傳一個 Http status
        if (status == HttpStatus.SC_OK){
            //pass file success
        }else{
            System.out.println("Pass file to OfficeService fail for Http status : " + status);
        }
			
        filePost.releaseConnection();
    }
} catch (FileNotFoundException e) {
    System.out.println(e.getMessage());
    e.printStackTrace();
} catch (HttpException e) {
    System.out.println(e.getMessage());
    e.printStackTrace();
} catch (IOException e) {
    System.out.println(e.getMessage());
    e.printStackTrace();
}


上面的 Code 很簡單,透過 commons 的 httpclient,可以不用程式設計師實際去寫檔案的 Post 封包

這個套件都幫你做好了

接著來看看 Server 端的 Servlet 如何收到這個 Request

protected void doPost(HttpServletRequest request, HttpServletResponse response) 
                                                                     throws ServletException, IOException {
    FileItemFactory factory =  new DiskFileItemFactory();
    ServletFileUpload upload =  new ServletFileUpload(factory);

    try {
        List fileItems = upload.parseRequest(request);
			
        Iterator iter = fileItems.iterator();
        while(iter.hasNext()){
            FileItem item = (FileItem)iter.next(); 
            if(item.isFormField()){
                String name = item.getFieldName();   
                String value = item.getString();
                System.out.println("FieldName : " + name + "  Value : " + value);
            }else{
                String fileName = item.getName();
                System.out.println("File name : " + fileName);
                int fileSize = (int)item.getSize();
                System.out.println("File size : " + fileSize);
                //.....
	    }
        }

    } catch (FileUploadException e) {
        System.out.println(e.getMessage());
        e.printStackTrace();
    }
}

關於 commons 的 fileUpload 操作我這邊不多說,可以看之前這篇文章 
【Java Web】commons-fileUpload 使用方法

沒有留言:

張貼留言