JavaWeb文件上傳下載功效深刻剖析(二)。本站提示廣大學習愛好者:(JavaWeb文件上傳下載功效深刻剖析(二))文章只能為提供參考,不一定能成為您想要的結果。以下是JavaWeb文件上傳下載功效深刻剖析(二)正文
接著上一篇論述:
2、文件上傳與下載
Struts2開辟的三板斧,頁面jsp—設置裝備擺設文件struts2.xml—-還有舉措類Action
文件上傳條件:
form表單的method必需是post
form表單的enctype必需是multipart/form-data
供給type=”file”的上傳輸出域
Struts 對文件上傳的支撐的一些規矩
1、單文件上傳
開辟步調:
1)、在WEB-INF/lib下參加commons-fileupload-1.2.1.jar、commons-io-1.3.2.jar。這兩個文件可以從http://commons.apache.org/下載
2)、第二步:編寫upfile.jsp ,把form表的enctype設置為:“multipart/form-data“,以下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s"%> <body> <s:actionerror/> <hr/> <s:fielderror></s:fielderror> <form action="${pageContext.request.contextPath}/upload1.action" method="post" enctype="multipart/form-data"><!-- 以MIME的方法傳遞 --> 用戶名:<input type="text" name="username"/><br/> 靓照:<input type="file" name="photo"/><br/> <input type="submit" value="上傳"/> </form> </body>
編寫毛病頁面error.jsp
<body> 辦事器忙,一會再試。 </body>
success.jsp
<body> 上傳勝利 </body>
3)、編寫UploadAction1 類:在Action類中添加屬性,屬性對應於表單中文件字段的稱號:
package com.itheima.actions; import java.io.File; import java.io.IOException; import org.apache.commons.io.FileUtils; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; //文件上傳:fileUpload攔阻器完成的 public class UploadAction1 extends ActionSupport { private String username; private File photo;//和表單的上傳字段名堅持分歧。類型是File類型的 private String photoFileName;//上傳的文件名 private String photoContentType;//上傳文件的MIME類型 //省略getter和setter辦法 public String upload(){ System.out.println(photoFileName+":"+photoContentType); //通俗字段: System.out.println(username); //上傳字段:上傳到某個文件夾。存到運用的images目次下 String realPath = ServletActionContext.getServletContext().getRealPath("/images"); File directory = new File(realPath); if(!directory.exists()){ directory.mkdirs(); } try { FileUtils.copyFile(photo, new File(directory, photoFileName)); return SUCCESS; } catch (IOException e) { e.printStackTrace(); return ERROR; } } }
在struts.xml文件中增長以下設置裝備擺設
<action name="upload1" class="com.itheima.actions.UploadAction1" method="upload"> <interceptor-ref name="defaultStack"> <param name="fileUpload.allowedTypes">image/jpeg,image/png</param> <param name="fileUpload.allowedExtensionsSet">jpg,jpeg,png</param> </interceptor-ref> <result>/success.jsp</result> <result name="error">/error.jsp</result> <result name="input">/index.jsp</result> </action>
道理剖析:
a 、FileUpload 攔阻器擔任處置文件的上傳操作, 它是默許的 defaultStack 攔阻器棧的一員. 攔阻器有 3 個屬性可以設置.
•maximumSize: 上傳文件的最年夜長度(以字節為單元), 默許值為 2 MB
•allowedTypes: 許可上傳文件的類型, 各類型之間以逗號分隔
•allowedExtensions: 許可上傳文件擴大名, 各擴大名之間以逗號分隔
可以在 struts.xml 文件中籠罩這 3 個屬性
b、超越年夜小或不法文件的上傳,會報錯(轉向一個input的視圖)
經由過程:
<s:actionError/> <s:feildError/>顯示毛病新聞的提醒
c、毛病新聞提醒改成中文版:借助國際化的新聞資本文件
假如是經由過程設置裝備擺設全局默許參數惹起的毛病,最好用全局的新聞資本文件。
struts2默許的提醒資本文件:struts2-core-**.jar 的org.apache.struts2的struts-message.properties文件中。比著key值籠罩對應的value便可。
設置裝備擺設以下:
struts.messages.error.uploading=Error uploading: {0}
struts.messages.error.file.too.large=File too large: {0} "{1}" "{2}" {3}
struts.messages.error.content.type.not.allowed=Content-Type not allowed: {0} "{1}" "{2}" {3}
struts.messages.error.file.extension.not.allowed=File extension not allowed: {0} "{1}" "{2}" {3}
{0}:<input type=“file” name=“uploadImage”>中name屬性的值
{1}:上傳文件的真實稱號
{2}:上傳文件保留莅臨時目次的稱號
{3}:上傳文件的類型(對struts.messages.error.file.too.large是上傳文件的年夜小)
源碼:
修正顯示毛病的資本文件的信息
第一步:創立新的資本文件 例如fileuploadmessage.properties,放置在src下
在該資本文件中增長以下信息
struts.messages.error.uploading=上傳毛病: {0}
struts.messages.error.file.too.large=上傳文件太年夜: {0} "{1}" "{2}" {3}
struts.messages.error.content.type.not.allowed=上傳文件的類型不許可: {0} "{1}" "{2}" {3}
struts.messages.error.file.extension.not.allowed=上傳文件的後綴名不許可: {0} "{1}" "{2}" {3}
第二步:在struts.xml文件加載該資本文件
<!-- 設置裝備擺設上傳文件的失足信息的資本文件 -->
<constant name="struts.custom.i18n.resources" value=“cn….xxx.fileuploadmessage“/>
2、多文件上傳
上傳多個文件, 可使用數組或 List,其他和單文件上傳相似。
package com.itheima.actions; import java.io.File; import java.io.IOException; import org.apache.commons.io.FileUtils; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; //文件上傳:fileUpload攔阻器完成的 public class UploadAction2 extends ActionSupport { private String username; private File[] photo;//和表單的上傳字段名堅持分歧。類型是File類型的 .數組或List private String[] photoFileName;//上傳的文件名 private String[] photoContentType;//上傳文件的MIME類型 public String upload(){ //上傳字段:上傳到某個文件夾。存到運用的images目次下 String realPath = ServletActionContext.getServletContext().getRealPath("/images"); File directory = new File(realPath); if(!directory.exists()){ directory.mkdirs(); } try { for(int i=0;i<photo.length;i++){ FileUtils.copyFile(photo[i], new File(directory, photoFileName[i])); } return SUCCESS; } catch (IOException e) { e.printStackTrace(); return ERROR; } } }
3、文件下載
道理:struts2供給了stream成果類型,該成果類型就是專門用於支撐文件下載功效的
指定stream成果類型 須要指定一個 inputName參數,該參數指定一個輸出流,供給被下載文件的進口
編碼步調:
1)、舉措類DownloadAction :
package com.itheima.actions; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.net.URLEncoder; import org.apache.commons.io.FilenameUtils; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; public class DownloadAction extends ActionSupport { private InputStream image;//用in有成績的 private String filename;//文件名 private long filesize; public InputStream getImage() { return image; } public void setImage(InputStream image) { this.image = image; } public String getFilename() { return filename; } public long getFilesize() { return filesize; } public String download() throws Exception{ //給image字撙節賦值 String fileRealPath = ServletActionContext.getServletContext().getRealPath("/WEB-INF/classes/霉女.jpg"); filename = FilenameUtils.getName(fileRealPath); //方法一:中文文件要停止URL編碼 // filename = URLEncoder.encode(filename, "UTF-8"); filesize = new File(fileRealPath).length(); System.out.println(filename); image = new FileInputStream(fileRealPath); return SUCCESS; } }
struts.xml設置裝備擺設文件:重要是對stream類型的成果停止設置裝備擺設
<struts> <constant name="struts.devMode" value="true" /> <constant name="struts.ognl.allowStaticMethodAccess" value="true" /> <action name="download" class="com.itheima.actions.DownloadAction" method="download"> <result type="stream"> <param name="inputName">image</param><!--舉措類中InputStream的字段名,須要在Action中供給getTargetFile辦法,前往inputStream--> <param name="contentType">application/octet-stream</param><!--告知閱讀器呼應頭,文件的MIME格局,挪用Action中的getContentType辦法--> <!-- 在struts.xml中應用OGNL表達式獲得舉措類中屬性的值。 挪用舉措類中的 getFilename()--> <!-- 中文文件名編碼:方法二.應用OGNL表達式,挪用URLEncode的靜態辦法 --> <!-- 默許OGNL挪用靜態辦法是不可的,須要開啟一個常量開關.struts.ognl.allowStaticMethodAccess=true --> <param name="contentDisposition">attachment;filename=${@java.net.URLEncoder@encode(filename,'UTF-8')}</param><!-- 告知閱讀器的下載方法--> <param name="contentLength">${filesize}</param> </result> </action> </package> </struts>
攔阻器和文件上傳就寫到這裡了,好累,不外造詣感滿滿的。
以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。