因爲項目的須要,使用Applet實現文件上傳被提上日程,做者關於applet實現文件上傳google了N次,baidu了m次,終於搞定。最大的感觸就是網上的資料有時候會誤導你,須要不停的作實驗,不停地尋找出現問題的解決方案。做者因爲幾個比較關鍵的地方網上的資料未提供,在此做爲記錄,但願能對新手提供一些有用的參考。
關於文件上傳的原理,能夠
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)行做爲分界符的結尾,注意,比第一行在最後多出兩個「-「。第4,9行爲空行,5-8行爲須要寫入二進制文件或者文本的地方。網上的一些資料沒有講這一部分,須要特別留意。
瞭解了文件上傳的格式,就可使用applet向服務器端寫入以上格式的內容,就能夠實現把文件上傳到服務器端了。若是服務器端使用Struts2,則框架爲咱們接收了文件,就不用寫servlet了。Struts2能夠處理以POST方式提交的數據。下面講述開發的客戶端代碼,服務器端的代碼若是不清楚,能夠參看Struts2的官方文檔。
假設系統使用UTF-8編碼,客戶端調用Applet上傳文件的代碼
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-type在Struts2中被解析爲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