文件上傳
1.jsp的設置
- enctype=”multipart/form-data” 上傳必備
- method=”post”
- 使用
<s: file name="XX"/>
<s:form action="/Upload" method="post" enctype="multipart/form-data" theme="simple">
選擇圖片:<s:file name="myPicture" /><br/>
<s:submit value="do it"/>
</s:form>
2.Action的設置
1.接收三個參數
private File myPicture;//文件對象
private String myPictureFileName;//用戶傳入文件名 如XXX.png
private String myPictureContentType;//文件的MIME類型 如image/png
//三個參數的setter方法
public void setMyPicture(File myPicture) {
this.myPicture = myPicture;
}
public void setMyPictureFileName(String myPictureFileName) {
this.myPictureFileName = myPictureFileName;
}
public void setMyPictureContentType(String myPictureContentType) {
this.myPictureContentType = myPictureContentType;
}
2.處理上傳文件
- 獲得webapp下的路徑ServletActionContext.getServletContext().getRealPath(“/WEB_INF/upload”);
- 獲得新的文件對象 new File(路徑,文件名)
- 文件拷貝
public class UploadAction extends ActionSupport implements Validateable{
public void validateExecute() {
if(myPicture==null) {
super.addFieldError("file","請選擇上傳文件");
}
}
@InputConfig(resultName="login")
public String execute() throws Exception {
//獲取文件存儲的路徑
ServletContext app = ServletActionContext.getServletContext();
String path = app.getRealPath("/WEB-INF/upload");
System.out.println(path);
//保存上傳文件
File file = new File(path,myPictureFileName);
FileUtils.copyFile(myPicture, file);
return "login";
}
}
3.配置文件的設置
常量配置
struts.multipart.parser=jakarta //上傳文件的組件
struts.multipart.saveDir=XX //臨池文件的目標 (不改)
struts.multipart.maxSize=2097152 //一次請求所有文件的大小不超2M
fileUpload攔截器
- 設置單個文件的大小
- 設置上傳文件的類型
- 因爲上傳的Action類很少,所以攔截器直接聲明在
<action>
中
<action name="Upload_*" class="action.UploadAction" method="{1}">
<!--聲明上傳攔截器-->
<interceptor-ref name="fileUpload">
<param name="allowedExtensions">png,gif</param>
<param name="maximumSize">102400</param>
</interceptor-ref>
<!--聲明上傳默認攔截器-->
<interceptor-ref name="defaultStack"/>
</action>
情況1;上傳文件不符合大小時:
情況2:上傳文件不符合類型時;
4.錯誤信息的國際化
如何使得文件過大,文件不符合類型轉爲中文信息?
英文信息來源
數值的含義
- {0}:文件對象的名,即
<s:file>
的name屬性 - {1}:用戶上傳的文件本地名稱
- {2}:在臨時目錄中的名稱
- {3}:文件的mime類型
- {4}:攔截器中,文件的最大值 -
- {0}:文件對象的名,即
- 修改成中文
添加uploadMessage.properties文件
struts.messages.error.file.too.large=文件{1}過大,請不要超過{4}
struts.messages.error.file.extension.not.allowed=文件類型爲{3},不符合要求
引入到struts.xml文件中
<constant name="struts.custom.i18n.resources" value="uploadMessage"/>
修改後的結果爲
文件下載
jsp的設置
fileName的作用:
- 在Action類中,配合路徑定位到文件
- 在Struts.xml文件中,設爲用戶下載文件的默認名
<s:a action="/Download?fileName=文件名">文件名</s:a>
<s:a action="/Download?fileName=LWF.png">LWF.png</s:a>
Action類的設置
- 接收請求的參數fileName
- setter:用於請求時候注入參數
- getter:用於給用戶下載文件時候,提供默認文件名
private String fileName;
//用於接收請求來的參數
public void setFileName(String fileName) {
this.fileName = fileName;
}
//用於struts.xml中輸出參數
public String getFileName() {
return fileName;
}
public class DownloadAction extends ActionSupport{
//用於返回文件的方法 ,getXXX
public InputStream getInputStream() throws Exception {
//獲得文件所在目錄
ServletContext app = ServletActionContext.getServletContext();
String path = app.getRealPath("/WEB-INF/download");
//生成文件對象
File file=new File(path,fileName);
return new FileInputStream(file);
}
}
//增強:可以用包裝的讀取流來提速
return new BufferedInputStream(new FileInputStream(file));
struts.xml的設置
- 下載的邏輯視圖類型爲”stream”
- 設置參數
- inputName=輸出流的方法名稱
- contentDisposition=attachment;filename=”用戶下載文件時候的默認名”
//用${fileName}從Root中取(因爲有getter方法)
<action name="Download_*" class="action.DownloadAction" method="{1}">
<result type="stream">
<param name="inputName">inputStream</param><!--是默認值,也對應這方法getInputStream-->
<param name="contentDisposition">attachment;filename="hahah"</param>
</result>
</action>
執行流程
1.訪問Action後,返回邏輯視圖爲success,type爲"stream";(默認訪問execute方法返回success)
2.根據參數inputName,從Action中獲得文件的輸出流,
3.根據contentDisposition,給被下載的文件賦予初始名
4.響應給用戶