java action 上传文件_JavaWeb框架_Struts2_(七)-----文件的上传和下载
1.? 前言
這個章節是Struts2框架應用最廣泛的三個版塊(上傳下載、國際化、校驗輸入)之一,所以這一版塊的學習還蠻重要的。
2.? 具體內容
2.1Struts2文件上傳
2.1.1單文件上傳
本小節通過一個示例講解Struts2如何實現單文件的上傳。
(1) 先寫一個選擇上傳單文件頁面(select.jsp)
User: mairr
Date: 17-12-7
Time: 下午9:04
To change this template use File | Settings | File Templates.
--%>
upload_test輸入帳號:
選擇頭像:
如下所示的一個上傳選擇界面框:
(2) 當文件上傳頁面提交請求時,請求發送到upload.action,這是一個Struts2的Action,該Action處理上傳請求,具體的UploadAction類代碼如下:
packageaction;importcom.opensymphony.xwork2.ActionSupport;importorg.apache.commons.io.FileUtils;importorg.apache.struts2.ServletActionContext;importjava.io.File;importjava.io.IOException;public class UploadAction extendsActionSupport {
private String uid; //封裝帳號(uid)請求參數屬性
private File headImage; //封裝上傳文件域屬性
private String headImageContentType; //封裝上傳文件類型的屬性
privateString headImageFileName; //封裝上傳文件屬性publicString getUid() {returnuid;
}public voidsetUid(String uid) {this.uid =uid;
}publicFile getHeadImage() {returnheadImage;
}public voidsetHeadImage(File headImage) {this.headImage =headImage;
}publicString getHeadImageContentType() {returnheadImageContentType;
}public voidsetHeadImageContentType(String headImageContentType) {this.headImageContentType =headImageContentType;
}publicString getHeadImageFileName() {returnheadImageFileName;
}public voidsetHeadImageFileName(String headImageFileName) {this.headImageFileName =headImageFileName;
}public String execute() throwsIOException {//上傳文件的保存位置在“/image”,該位置在tomcat服務器的“webapps”之中
String realpath= ServletActionContext.getServletContext().getRealPath("/image");//聲明文件目錄image,如果文件名不存在就建一個唄~
File file = newFile(realpath);if(!file.exists()){
file.mkdirs();
}//實現文件上傳,也就是做了一個方法調用~
FileUtils.copyFile(headImage,newFile(file,headImageFileName));returnSUCCESS;
}
}
需要注意的是,上面的Action除了包含兩個表單域的name屬性外,還包含headImageContentType和headImageFileName兩個屬性,這兩個屬性分別能用于封裝上傳文件的文件類型、上傳文件的文件名。可以這樣認為:如果表單中包含一個name屬性為xxx的文件域,則對應的Action需要使用3個屬性來封裝文件域信息:
類型為java.io.File的xxx屬性來封裝文件域的信息;
類型為String的xxxFileName屬性封裝了該文件域對應的文本內容;
類型為String的xxxContentType屬性封裝了該文件域對應的文件類型。
所以,在Action的execute方法中,可以直接通過這3個屬性獲取上傳文件的文件名、文件類型和文件內容。
(3) 接下來進行UploadAction的配置(struts.xml文件配置),具體代碼如下:
/p>
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
/uploadSuccess.jsp
(4) 最后寫一個上傳成功頁面(uploadSuccess.jsp)
上傳初始頁用戶帳號:
您的頭像:" alt="圖像無法顯示"/>
上傳過程圖:
(a)選擇圖片
(b)確認選擇
(c)提交之后,顯示上傳成功
2.1.2 攔截器實現文件的過濾
Struts2提供了一個名為fileUpload攔截器,通過配置該攔截器可以輕松地實現文件過濾。為了讓fileUpload攔截器起作用,只需要在處理文件上傳的Action中配置該攔截器引用即可。
配置fileUpload攔截器時可以指定如下兩個參數:
allowTypes:該參數指定允許上傳文件的類型,多個文件類型之間以英文逗號隔開;
maximumSize:該參數指定允許上傳文件的大小,單位是字節。
當文件過濾失敗后,系統自動轉入input邏輯視圖,因此必須為Action配置名為input的邏輯視圖。
(1) 通過攔截器來實現文件過濾的struts.xml配置文件如下:
/p>
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
image/x-png,image/bmp,image/gif,image/jpeg,image/jpg
65536
/uploadSuccess.jsp
/select.jsp
格式不對和容量大于64kb會上傳失敗,直接返回重新選擇的界面。如果上傳失敗,系統需要回應上傳失敗信息。因此,需要在文件上傳頁selectFile.jsp頁面中加上“”------->(我直接加到了selectFile.jsp代碼中,你可以回看上面)
(a) 文件格式不對
------(提交之后)------->
(b) 文件大小超過了限額
-------(提交之后)----->
2.1.3? 文件上傳的常量配置
上傳文件時,系統默認使用web服務器的工作路徑作為臨時路徑。為了避免文件上傳時候使用Web服務器的工作路徑作為臨時路徑,則應該設置struts.multipart.saveDir常量。該常量指定上傳文件的臨時保存路徑。該常量配置示例如下:
此外,還有一個文件上傳的常量struts.multipart.maxSize。該常量指定struts.mutipart.maxSize。該常量指定在struts2文件上傳中整個請求內容所允許的最大字節數,默認為2097152(即2MB)。該常量配置示例如下:
2.1.4? Struts2多文件上傳
在Struts2應用中,如果一個頁面有多個文件域需要實現上傳,則可以為每個文件域提供三個屬性,分別封裝該文件域對應的文件名、文件類型和文件內容。多文件上傳與單文件上傳沒有什么區別,僅僅是利用數組同時上傳多個文件的方式。
在處理多文件上傳時,要注意改變的是,在Action類中,需要使用三個數組分別封裝文件名、文件類型和文件內容。
//實現單文件上傳代碼如下:
FileUtils.copyFile(headImage,newFile(file,headImageFileName));//實現多文件下載代碼如下:
for(int i = 0; i < headImage.length(); i++){
File uploadImage=headImage[i];
FileUtils.copyFile(uploadImage,newFile(file,headImageFileName[i]));
}
2.2? Struts2文件下載
利用Struts2來處理文件的下載的問題時,能夠解決下載文件的文件名為中英文等等都不出現亂碼。此外,還能夠在用戶下載之前進行檢查,判斷用戶是否有足夠的權限來下載該文件等。下面用一個示例來講解文件的下載:
(1) 先寫一個下載頁面:(index.jsp)
User: mairr
Date: 17-12-9
Time: 下午2:20
To change this template use File | Settings | File Templates.
--%>
test_download中請下載英文課件:英
(2) 在Struts2框架文件下載Action類中,需要提供一個返回InputStream流方法,該輸入流代表了被下載文件的入口。該Action類代碼如下所示:(DownLoadAction.java)
packageaction;importcom.opensymphony.xwork2.ActionSupport;importorg.apache.struts2.ServletActionContext;importutil.MyUtil;importjava.io.InputStream;importjava.io.UnsupportedEncodingException;public class DownLoadAction extendsActionSupport{private String downPath; //下載時的文件名
private String contentType; //保存文件類型
private String filename; //保存時的文件名
publicString getContentType() {returncontentType;
}public voidsetContentType(String contentType) {this.contentType =contentType;
}publicString getFilename() {returnfilename;
}public voidsetFilename(String filename) {this.filename =filename;
}publicString getDownPath() {returndownPath;
}public voidsetDownPath(String downPath) {try{//解決下載時候的中文文件亂碼問題
downPath = new String(downPath.getBytes("ISO-8859-1"),"UTF-8");
}catch(UnsupportedEncodingException e){
e.printStackTrace();
}this.downPath =downPath;
}/**下載用的Action返回一個InputString實例,該方法對應Action配置
*里面的result的inputName參數,值為inputString
**/
publicInputStream getInputString(){returnServletActionContext.getServletContext().getResourceAsStream(downPath);
}publicString execute(){//下載保存時的文件名和被下載的文件名一樣
filename =downPath;//下載的文件路徑,請在webapps目錄下創建images
downPath = "images/" +downPath;//保存文件的類型
contentType= "application/x-msdownload";/**對下載的文件名按照UTF-8進行編碼,解決下載窗口中的中文亂碼問題
* 其中,MyUtil是自己定義的一個類*/filename=MyUtil.toUTF8String(filename);returnSUCCESS;
}
}
(3) 在上述的Action類中定義了一個工具類MyUtil,該類中有一個靜態方法toUTF8String實現對下載的文件名按照UTF-8進行編碼,解決下載窗口中中文亂碼的問題:(MyUtil.java)
packageutil;importjava.io.UnsupportedEncodingException;public classMyUtil {//對下載文件按照 UTF-8 進行編碼
public staticString toUTF8String(String str){
StringBuffer sb= newStringBuffer();int len =str.length();for (int i = 0; i < len; i++)
{//取出字符中的每個字符
char c =str.charAt(i);//Unicode碼值在0~255之間,不做處理
if(c>=0 && c <= 255){
sb.append(c);
}else{//轉換 UTF-8 編碼
byteb[];try{
b= Character.toString(c).getBytes("UTF-8");
}catch(UnsupportedEncodingException e){
e.printStackTrace();
b= null;
}//轉換為%HH的字符串形式
for(int j = 0;j < b.length ; j++){int k =b[j];if(k < 0){
k&= 255;
}
sb.append("%" +Integer.toHexString(k).toUpperCase());
}
}
}returnsb.toString();
}
}
(4) 最后,完成Action的配置,關鍵是要配置一個類型為stream的結果,配置時需要指定如下四個屬性:
contentType:? 指定被下載文件的文件類型;
inputName:? 指定被下載文件的入口輸入流;
contentDisposition:? 指定下載的文件名;
bufferSize:? 指定下載文件時的緩沖大小。
具體代碼如下:(struts.xml)
/p>
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
${contentType}
inputStream
attachment;filename=${filename}
4096
(5)? 最后的下載窗口:
總結
以上是生活随笔為你收集整理的java action 上传文件_JavaWeb框架_Struts2_(七)-----文件的上传和下载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java实现下载压缩文件_java实现文
- 下一篇: java 多线程的使用_Java的多线程