Applet結合Struts2實現文件上傳

因爲項目的須要,使用Applet實現文件上傳被提上日程,做者關於applet實現文件上傳googleN次,baidum次,終於搞定。最大的感觸就是網上的資料有時候會誤導你,須要不停的作實驗,不停地尋找出現問題的解決方案。做者因爲幾個比較關鍵的地方網上的資料未提供,在此做爲記錄,但願能對新手提供一些有用的參考。
關於文件上傳的原理,能夠 baidu 一下,網上的資料說得比較明白,在這裏略微提一下,文件經過 html 上傳須要設置提交 form 表單的表單元素的 enctype=」 multipart/form-data」 原理是,經過爲表單元素設置 enctype=」multipart/form-data」 屬性,讓表單提交的數據以二進制編碼的方式提交,在接收此請求的 Servlet 中用二進制流來獲取內容,就能夠取得上傳文件的內容,從而實現文件的上傳。文件上傳後在服務器端得表示以下 ( 選擇文本 )
當上面文件執行之後會產生以下結果:(選擇的上傳文件不一樣,結果相似)

(1) -----------------------------7d 45a 76025c  
(2) Content-Disposition: form-data; name="text1"; filename=" D:\1.txt" 
(3) Content-Type: text/plain 
(4) 
(5) public static void main(String[] args) { 
(6) FileUtil.makeDir("dir1/dir2/dir3/dir4","c:/java/"); 
(7) } 
(8) } 
(9)
(10) -----------------------------7d 45a 76025c -- 
其中第一行爲分界符,和(10)行同樣,第(10)行做爲分界符的結尾,注意,比第一行在最後多出兩個「-「。第49行爲空行,5-8行爲須要寫入二進制文件或者文本的地方。網上的一些資料沒有講這一部分,須要特別留意。
瞭解了文件上傳的格式,就可使用applet向服務器端寫入以上格式的內容,就能夠實現把文件上傳到服務器端了。若是服務器端使用Struts2,則框架爲咱們接收了文件,就不用寫servlet了。Struts2能夠處理以POST方式提交的數據。下面講述開發的客戶端代碼,服務器端的代碼若是不清楚,能夠參看Struts2的官方文檔。
假設系統使用UTF-8編碼,客戶端調用Applet上傳文件的代碼
       String url=http://127.0.0.1:8080/upload.action// 接收文件的action
       HttpURLConnection con = (HttpURLConnection) new URL(url) .openConnection();//打開鏈接
String boundary=」------------------------ -123456」 ;//設置的分解符比實際用的少2個「-
String twoHypeLine=」 -- 「;
String lineEnd=」\r\n」;
con.setDoOutput(true);
conn.setUseCaches(false);
   // Use a post method.POST 爲大寫
        conn.setRequestMethod("POST");
 con.setRequestProperty("Accept", "*/*");
con.setRequestProperty("Accept-Language", "zh-cn");
//設置分隔符
con.setRequestProperty("Content-Type",
                                          "multipart/form-data; boundary="+boundary);
con.setRequestProperty("Accept-Encoding", "gzip, deflate");
con.setRequestProperty("Connection", "Keep-Alive");
con.setRequestProperty("Cache-Control", "no-cache");
              // 設置流式輸出的請求頭和請求尾
String header =( twoHypeLine + twoHypeLine +boundary+lineEnd+
                            + "Content-Disposition: form-data; name=\"upload\"; filename=\"%s\" " +lineEnd+ "Content-Type: application/octet-stream "+ lineEnd+ lineEnd;
//name屬性能夠理解爲<input type=」file」>中的name屬性,在Struts2中被解析爲uploadFileName屬性
//content-typeStruts2中被解析爲UploadContentType
byte[] tailbyte =( lineEnd + twoHypeLine +boundary+ twoHypeLine+ lineEnd)  .getBytes();
//文件名種包含中文時,必定要記得使用utf-8
byte[] headByte = String.format(header, file.getName()).getBytes(「utf -8」 );
 // 設置請求體的長度(直接輸出,避免在本地進行緩存),同時鏈接服務器
con.setFixedLengthStreamingMode((int) file.length() + headByte.length+ tailbyte.length);
con.connect();
// 寫文件流到請求體中
OutputStream dos = con.getOutputStream();
dos.write(headByte); // 寫文件頭
//file爲本地打開的文件
FileInputStream fis = new FileInputStream(file);
int len = 0;
byte b[] = new byte[blockSize];
while (len != -1) {
       len = fis.read(b);
       if (len > 0) {
              dos.write(b, 0, len);
              dos.flush();
              uploadStatus.upload(len);
       }
}
fis.close();
dos.write(tail);
dos.close();
至此文件基本上能夠正確的寫入到服務器端,那麼如何從服務器端讀取哪?上傳以後的文件能夠經過json格式回傳數據,在Struts2中只須要設置爲返回類型爲json便可,
InputStream is = con.getInputStream();
byte[] response = new byte[is.available()];
is.read(response);
JsonObject  jo=new JsonObject(new String(response.getBytes(「UTF -8」 ));
 
因爲回傳的數據爲UTF-8格式的,必須經過轉碼才能被JSON對象識別,對於返回的數據,能夠作你想作的任何處理,好比在頁面上顯示等等。固然在上傳過程當中能夠實現進度條。 君好運。
參考網站: http://mupload.googlecode.com
相關文章
相關標籤/搜索