Struts2學習筆記14:Struts2的文件上傳和下載【續】
Struts2學習筆記14:Struts2的文件上傳和下載【續】
第十二講
學習內容:
通過實例,實現非基于struts2的文件上傳
使用文件
-:
http://apache.mirror.phpchina.com/commons/io/binaries/commons-io-1.4-bin.zip
commons-io-1.4.jar
-:
http://apache.freelamp.com/commons/fileupload/binaries/commons-fileupload-1.2.1-bin.zip
commons-fileupload-1.2.1.jar
將上面的兩個jar包導入到項目中——WebRoot/WEB-INF/lib目錄中
步驟:
1)
在src目錄中新建包"upload",在包中新建Servlet文件,名為
UploadServlet.java
,URL設置為"/uploadservlet"
2)
在WebRoot中新建文件夾"upload",在該文件中建立兩個JSP文件,分別名為:upload.jsp和result.jsp
upload.jsp
顯示上傳文件頁面
result.jsp
返回顯示信息
3)
在upload.jsp文件中添加表單
4)
在result.jsp文件中使用EL表達式顯示返回信息
username:?${requestScope.username?}
password:?${requestScope.password?}
file1:${requestScope.file1?}
fiel2:${requestScope.file2?}
5)
編寫UploadServlet.java文件,代碼如下:
@SuppressWarnings(?{?"deprecation",?"unchecked"?})????public?void?doPost(HttpServletRequest?request,?HttpServletResponse?response)????????????throws?ServletException,?IOException?{????????DiskFileItemFactory?factory?=?new?DiskFileItemFactory();??//磁盤文件項目工廠 ????????String?path?=?request.getRealPath("/upload");?//獲取實時路徑為"/upload",其中根目錄為WebRoot ????????factory.setRepository(new?File(path));??//大于設定的閾值大小的文件暫時存放目錄 ????????factory.setSizeThreshold(1024?*?1024);??//設置的大小超出該指定值,則直接寫到磁盤 ????????ServletFileUpload?upload?=?new?ServletFileUpload(factory);??????????//上傳文件中最重要的類,處理上傳文件信息 ????????try?{????????????ListFileItem
?instances?parsed?from?the ????????????//?request,?in?the?order?that?they?were?transmitted. ????????????????????????//使用循環遍歷list ????????????for?(FileItem?item?:?list)?{????????????????//一個item對應于表單中的一項 ????????????????if?(item.isFormField())?{?//判斷item是一般的form字段還是file字段 ????????????????????//如果是一般字段則運行下面的代碼,否則運行else語句中的語句 ????????????????????String?name?=?item.getFieldName();?//獲取屬性名 ????????????????????String?value?=?item.getString("utf-8");?//通過一種編碼格式獲取屬性值 ????????????????????request.setAttribute(name,?value);?//將name屬性名和value屬性值放置到request的屬性中 ????????????????????//將來使用EL表達式進行讀取 ????????????????}?else?{????????????????????String?name?=?item.getFieldName();?//獲取field名 ????????????????????String?value?=?item.getName();?//獲取field屬性值 ????????????????????//下面代碼用于解析文件名,因為有的瀏覽器在進行文件上傳的時候,將文件的路徑與文件名都包含進去, ????????????????????//而有的瀏覽器在進行文件上傳的時候,僅包含文件名,所以需要進行解析 ????????????????????int?start?=?value.lastIndexOf("http://");?//獲取file中最后"/"的出現位置????????????????????//在最后"/"后面接的是文件名 ????????????????????String?fileName?=?value.substring(start?+?1);?//獲取文件名,從最后出現斜杠的位置后開始讀取字符串 ????????????????????request.setAttribute(name,?fileName);?//將name屬性名和文件名放置到request的屬性中 ????????????????????//將來使用EL表達式進行讀取 ????????????????????????????????????????//第一個方法,一個簡便的上傳文件方法,可以代替下面的語句 ????????????????????????????????????????//方便的方法寫上載的項目到磁盤。客戶端代碼不關心與否的項目是儲存在內存中,或 ????????????????????//磁盤在一個臨時位置。他們只想寫上載項目到一個文件中。 //??????????????????try?{ //??????????????????????item.write(?new?File(path,fileName)?); //??????????????????}?catch?(Exception?e)?{ //??????????????????????e.printStackTrace(); //??????????????????} ????????????????????//比較復雜的上傳文件的方法,第二個方法 ????????????????????//新建一個輸出流,?????????格式為文件輸出流????建立一個File對象構造方法節中加入文件路徑和文件名 ????????????????????OutputStream?os?=?new?FileOutputStream(new?File(path,????????????????????????????fileName));????????????????????//建立一個輸入流,從item中獲取輸入流 ????????????????????InputStream?is?=?item.getInputStream();????????????????????//將輸入流中的信息方法輸出流中 ????????????????????byte[]?buffer?=?new?byte[400];//定義一個字節數組,緩沖400 ????????????????????int?length?=?0;????????????????????while?((length?=?is.read(buffer))?>?0)?{?//length大于0,表示還有內容 ????????????????????????os.write(buffer,?0,?length);?//將buffer中的信息,寫出,起始位置0,長度length ????????????????????}????????????????????is.close();?//關閉輸入流 ????????????????????os.close();?//關閉輸出流 ????????????????}????????????}????????????//請求轉發到result.jsp頁面中,將request和response都傳到result.jsp中 ????????????request.getRequestDispatcher("/upload/result.jsp").forward(request,????????????????????response);????????}?catch?(FileUploadException?e)?{????????????e.printStackTrace();????????}????}}
6)
注釋掉wem.xml文件中的filter元素,本實例是非基于struts2的編程。
7)
運行。
JSP Struts
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。