文件上傳與下載
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