以前感覺文件上傳不怎麼會,都是從網上粘貼的代碼就行了,這兩天學習了下Struts2的文件上傳,感覺很好用啊!記錄以便己用。
在JavaEE中的文件上傳需要注意一點的是就是:表單的enctype屬性了。
enctype主要有三種屬性:
1、application/x-www-form-urlencoded:這個是默認的編碼方式,它只處理表單域中的value值,採用這種方式會把表單域中的值處理成URL的形式。
2、multipart/form-data:這種方式會以二進制的方式來處理表單中的數據,它也會把文件域指定的文件封裝到請求參數中去。
3、text/plain:當表單action屬性爲mailto:URL的形式的時候使用它比較方便,它主要是用於直接通過表單發送郵件的情況。
使用Struts2上傳文件主要依賴的組件是common-fileupload.jar和common-io-*.jar,而且在JSP中的文件類型的Input中,在Struts2中相對應着三個屬性值分別爲:文件類型:***,String類型:***FileName,String類型:***ContentType
JSP中表單如下:
<s:form action="addPic" method="post" enctype="multipart/form-data">
<s:textfield name="picName" label="圖片名" />
<s:file name="pic" label="請選擇文件" />
<s:submit value="提交" />
</s:form>
提交給Struts2的Action
public class AddPicAction extends ActionSupport {
private String picName;
//每個上傳的文件域需要封裝三個字段域
private File pic; //對應上傳文件本身
private String picFileName; //對應上傳文件的原始名字
private String picContentType; //對應上傳文件的類型
@Override
public String execute() throws Exception{
//這裏主要是通過IO流實現文件的讀寫
String uploadPath = ServletActionContext.getServletContext().getRealPath("/upload");
String newFileName = UUID.randomUUID().toString()+
picFileName.substring(picFileName.lastIndexOf("."));
//打印一下文件保存的路徑
System.out.println(uploadPath+"/"+newFileName);
//IO輸入流通過FileInputStream將文件從盤中讀進來
FileInputStream is = new FileInputStream(pic);
//通過FileOutputStream將文件寫到我們要保存的路徑下
FileOutputStream os = new FileOutputStream(uploadPath +"/"+newFileName);
byte[] buff = new byte[1024];
int len = 0;
while((len = is.read(buff))>0){
os.write(buff, 0, len);
}
is.close();
os.close();
return SUCCESS;
}
//這裏字段的setter和getter方法就省略啦!
}
之後通過struts2的配置文件跳轉到相應的頁面就行了,然後還需要對上傳文件進行過濾,肯定不能讓什麼文件都能上傳,那樣相當不安全吧!
Struts2給我們提供了一個fileUpload攔截器,使用相當方便,我只需要在Strtus2的配置文件中引入相應的攔截器就行了:如下:
<action name="addPic" class="struts2.AddPicAction">
<interceptor-ref name="fileUpload">
<!-- 設置允許上傳的文件類型 -->
<param name="allowedTypes">image/jpeg,image/png,
image/gif,image/pjpeg</param>
<!-- 設置允許上傳文件的大小爲:20K -->
<param name="maximumSize">20000</param>
</interceptor-ref>
<!-- 還需要系統默認的攔截器 -->
<interceptor-ref name="defaultStack" />
<result name="input">upload.jsp</result>
<result>success.jsp</result>
</action>
這個地方注意的一點是引入了fileUpload攔截器之後,系統默認的攔截器就不起作用了,這時還需要我們手動的把defaultStack引入進去。
如果上傳文件不符合我們要求的就會報錯,系統會默認提示錯誤,但是那都是英文的,對於我們使用漢語的來說不是一件好事啊!所以我們需要把英文轉換成漢語,我需要建一個國際化文件比如:message_zh_CN.properties我們可以把報錯的信息寫進去:
struts.messages.error.content.type.not.allowed是提示文件不是允許的類型
struts.messages.error.file.too.large是提示文件太大
struts.messages.error.uploading是提示未知錯誤
這樣攔截器就完成了!