程式扎記: [ Java 代碼範本 ] Httpclient : Post files

標籤

2012年7月25日 星期三

[ Java 代碼範本 ] Httpclient : Post files

Preface : 
因為工作需求, 需要自動的 Post 檔案到 Web Server 上, 故寫了這個小工具. 使用了 Apache Httpclient 4.x 的套件作為底層的開發. 

分析頁面 : 
第一步你需要做的便是分析上傳的頁面, 才能知到要 Post 到那邊去, 與使用的 parameter 名稱為何. 假設有頁面如下, 請按滑鼠右鍵分析頁面 : 
 

接著從下面分析可以知道 "Post path" 與 "Post param name" : 
 

範例代碼 : 
有了這些頁面的資訊, 接著我們便可以來撰寫代碼利用 Post 將我們的檔案上傳到 Web server : 
- PostEx.java 
  1. package john.test;  
  2.   
  3. import java.io.File;  
  4.   
  5. import org.apache.http.HttpResponse;  
  6. import org.apache.http.client.HttpClient;  
  7. import org.apache.http.client.methods.HttpPost;  
  8. import org.apache.http.entity.mime.HttpMultipartMode;  
  9. import org.apache.http.entity.mime.MultipartEntity;  
  10. import org.apache.http.entity.mime.content.FileBody;  
  11. import org.apache.http.impl.client.DefaultHttpClient;  
  12. import org.apache.http.util.EntityUtils;  
  13.   
  14. public class PostEx {  
  15.     public static void main(String[] args) throws Exception{  
  16.         String ip = "172.22.8.184";  
  17.         String cnt_type = "multipart/form-data";  
  18.         String paramName = "uploadedfile";  
  19.         String postFilePath = "test.txt";  
  20.   
  21.         String url = String.format("http://%s/cgi-bin/upload.php", ip);  
  22.         HttpClient client = new DefaultHttpClient();          
  23.         int statusCode = -1;  
  24.           
  25.         System.out.printf("\t[Info] Upload file='%s'...\n", postFilePath);  
  26.         HttpPost post = new HttpPost( url );  
  27.         MultipartEntity entity = new MultipartEntity( HttpMultipartMode.BROWSER_COMPATIBLE );  
  28.           
  29.         File paramValue = new File(postFilePath);  
  30.           
  31.         // For File parameters  
  32.         entity.addPart( paramName, new FileBody((( File ) paramValue ), cnt_type ));  
  33.         post.setEntity( entity );  
  34.         HttpResponse resp = client.execute(post);   
  35.         System.out.printf("\t[Info] Status Code=%d...\n", resp.getStatusLine().getStatusCode());  
  36.         String response = EntityUtils.toString( resp.getEntity(), "UTF-8" );              
  37.         System.out.printf("\t[Info] HTTP Response:\n%s\n", response);  
  38.     }  
  39. }  
執行結果如下 : 
[Info] Upload file='test.txt'...
[Info] Status Code=200...
[Info] HTTP Response:
Source=test.txt
Destination=
Target path=/tmp/upload/test.txt
Size=36
The file test.txt has been uploaded

如果你需要指定更詳細的 Content-type 讓後端 Web server 有更多資訊知道如何處理這個檔案, 你可以參考 Internet media type 並設定上面代碼的變數 cnt_type 為適當對應你上傳檔案副檔名的 MIME type 即可. 

Supplement : 
Uploading files – multipart HTTP POST and Apache HttpClient

沒有留言:

張貼留言

網誌存檔

關於我自己

我的相片
Where there is a will, there is a way!