十六、Struts2文件上传与下载
文件上傳與下載
1.文件上傳前提:<form action="${pageContext.request.contextPath}/*" method="post" enctype="multipart/form-data">
2.動作類中字段需要符合命名規范
????表單字段名:image
????動作類:File image;
???? String imageFileName; 文件名
???????????? String imageContentType;文件的MIME類型
3.上傳攔截器參數的配置
文件大小、文件類型限制等
錯誤消息提示:中文????
4.多文件上傳:File或者List數組
?
單文件上傳
開發步驟:
Jsp代碼:
<br/> ----單文件上傳----<br/> <s:form action="uploadOneAction" enctype="multipart/form-data"> ????????<s:textfield name="username" label="姓名"></s:textfield> ????????<s:file name="photo" label="相片"></s:file> ????????<s:submit value="上傳"></s:submit> </s:form> |
?
Struts.xml文件配置代碼:
<package name="p1" extends="struts-default"> ????????<action name="uploadOneAction" class="com.itheima.action.UploadAction1"> ????????????<result>/success.jsp</result> ????????</action> </package> |
?
動作類代碼:
public class UploadAction1 extends ActionSupport { ????// 變量命名需與表單名稱保持一致 ????private String username; ????// 與表單字段對應,必須是java.io.File類型的 ????private File photo; ????// 上傳的文件名,格式:上傳字段名+FileName ????private String photoFileName; ????// 上傳文件MIME類型,格式:上傳字段名+ContentType ????private String photoContentType; ? ????public String execute() throws Exception { ????????// 打印相關字段屬性 ????????System.out.println(username); ????????System.out.println(photo); ????????System.out.println(photoFileName); ????????System.out.println(photoContentType); ????????/* ???????? * 上傳文件步驟: ???????? * 1.得到上傳文件的真實路徑 ???????? * 2.構建輸入流 ???????? * 3.構建輸出流 ???????? */ ????????// 1.得到上傳文件的真實路徑 //上傳字段:上傳到某個文件夾。存到應用的files目錄下 ????????String storeDir = ServletActionContext.getServletContext().getRealPath( ????????????????"files"); ????????// 把上傳過來的文件,重寫創建一個文件 ????????File file = new File(storeDir, photoFileName); ? ????????/* ????????// 以前復制文件的方式 ???????? * 但是現在呢?我們不需要這么做啦,Struts2都幫我們封裝了 ????????InputStream in = new FileInputStream(photo); ????????OutputStream out = new FileOutputStream(file); ? ????????int len = 0; ????????byte[] bys = new byte[1024]; ????????while ((len = in.read(bys)) != -1) { ????????????out.write(bys, 0, len); ????????} ????????in.close(); ????????out.close(); ????????*/ ????????FileUtils.copyFile(photo, file); ????????return SUCCESS; ????} } |
2、多文件上傳
將文件類型定義為:List 或者File數組
Jsp代碼:
<br>-----多文件上傳-----<br> <form action="${pageContext.request.contextPath}/upload2.action" method="post" enctype="multipart/form-data"> ????用戶名:<input type="text" name="username"/><br/> ????靚照:<input type="file" name="photo"/><br/> ????靚照:<input type="file" name="photo"/><br/> ????<input type="submit" value="上傳"/> </form> |
?
Struts.xml文件配置代碼:
<action name="upload2" class="com.itheima.actions.UploadAction2" 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">/indexMulti.jsp</result> ????????</action> |
?
動作類代碼:
//文件上傳: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、原理分析:
a、是由一個攔截器來完成的。fileUpload
可以通過配置攔截器的參數,指定攔截的擴展名或文件的MIME類型
<action name="uploadOneAction" class="com.itheima.action.UploadAction1"> ????????????<interceptor-ref name="defaultStack"> ????????????<!--對已有的攔截器注入參數 --> ????????????<param name="fileUpload.allowedExtensions">txt</param> ????????????</interceptor-ref> ????????????<result>/success.jsp</result> </action> |
?
b、超出大小或非法文件的上傳,會報錯(轉向一個input的視圖)
?
通過:
<s:actionError/> <s:feildError/>顯示錯誤消息的提示
c、錯誤消息提示改為中文版:借助國際化的消息資源文件
?
如果是通過配置全局默認參數引起的錯誤,最好用全局的消息資源文件。
?
?
struts2默認的提示資源文件:struts2-core-**.jar 的org.apache.struts2的struts-message.properties文件中。比著key值覆蓋對應的value即可。
4、文件下載
原理:是一個結果類型來處理的。stream
?
編碼步驟:
動作類:
public class DownloadAction extends ActionSupport { ????// 文件下載用到的輸入流 ????private InputStream imageFileIn; ????// 記住下載文件的文件名 ????private String fileName; ? ????public String download1() throws Exception { ????????// 給輸入流賦值即可 ????????String realPath = ServletActionContext.getServletContext().getRealPath( ????????????????"/file/mm.jpg"); ????????// c:\apacher\file\4.jpg ????????fileName = realPath.substring(realPath.lastIndexOf("\\") + 1); ????????// 解決中文名稱亂碼文件 ????????fileName = URLEncoder.encode(fileName, "UTF-8"); ????????imageFileIn = new FileInputStream(realPath); ????????return SUCCESS; ????} } |
?
struts.xml配置文件:主要是對stream類型的結果進行配置
<action name="download1" class="com.itheima.action.DownloadAction" method="download1"> ????????????<result type="stream"> ????????????????<!--動作類中InputStream的字段名 --> ????????????????<param name="inputName">imageFileIn</param> ????????????????<!-- 告知瀏覽器響應頭:文件的MIME類型 --> ????????????????<param name="contentType">application/octet-stream</param> ????????????????<!--告訴瀏覽器下載的方式 --> ????????????????<!-- 使用OGNL表達式獲取動作類中的屬性 --> ????????????????<param name="contentDisposition">attachment;filename=${fileName}</param> ????????????</result> </action> |
?
轉載于:https://www.cnblogs.com/Prozhu/p/5886462.html
總結
以上是生活随笔為你收集整理的十六、Struts2文件上传与下载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 汇编Ring 3下实现 HOOK API
- 下一篇: 免费下载网易云音乐付费歌曲及下架歌曲