Struts2 之 實現文件上傳和下載
必須要引入的jar
commons-fileupload-1.3.1.jar
commons-io-2.2.jar
01.文件上傳需要分別在struts.xml配置 和 創建文件上傳必要的類、
Jsp頁面的截圖
Struts.xml中的配置
配置上傳需要的savePath(文件上傳路徑)和 指定文件上傳的類
<action name="upload" class="cn.wz.upload.action.UploadAction" >
<param name="savePath">/upload</param>
<result name="success">success.jsp</result>
</action>
UploadAction類中的配置
該類需要繼承自ActionSupport ,重寫它的execute方法。
還要設置幾個必要的屬性:
uploadFileName(文件名)、
savePath(文件保存路徑地址)、
uploadContentType(上傳文件的類型)、
File file(該屬性的類型是File類型,封裝了上傳文件的屬性)。
public String execute() throws Exception {
byte[] bytes=new byte[1024];
FileInputStream fis=new FileInputStream(getUpload());
FileOutputStream fos=new FileOutputStream(getSavePath()+"\\"+getUploadFileName());
int lenth=fis.read(bytes);
while (lenth>0) {
fos.write(bytes, 0, lenth);
lenth=fis.read(bytes);
}
fis.close();
fos.flush();
fos.close();
return SUCCESS;
}
省略get和set方法...
public String getSavePath() {
return ServletActionContext.getServletContext().getRealPath(savePath);
}
02.實現多文件上傳、實現多文件上傳的操作非常簡單,在表單中添加多個相同的name屬性的File控件,這樣當表單提交時,將會提交一個數組。因此,只需要在上傳Action中將原本處理單個文件的操作改成對集合的操作即可。
public String execute() throws Exception {
byte[] bytes=new byte[1024];
for (int i = 0; i < upload.length; i++) {
FileInputStream fis=new FileInputStream(getUpload()[i]);
FileOutputStream fos=new FileOutputStream(getSavePath()+"\\"+getUploadFileName()[i]);
int lenth=fis.read(bytes);
while (lenth>0) {
fos.write(bytes, 0, lenth);
lenth=fis.read(bytes);
}
fis.close();
fos.flush();
fos.close();
}
return SUCCESS;
}
03.文件下載、Struts2為了支持文件的下載,提供了Stream結果類型,該類型的作用就是專門用於實現文件下載功能。
Stream結果類型。
該類型在實現文件下載功能時需要指定一個輸入流,即inputStream參數,通過這個流就可以輸出下載的文件內容。我們可能還需要對相關的參數進行配置,如MIME類型、HTTP請求頭信息、緩沖區的大小等。
Stream結果了類型的配置參數
contentType:發送到浏覽器的MIME類型。
contentLength:設置文件的大小。
contentDisposition:設置響應的inputStream類型的屬性名稱。
inputName:指定Action中提供的inputStream類型的屬性名稱。
bufferSize:讀取和下載時的緩沖區大小。
文件下載(當前示例是在jsp頁面有一個指向固定的文件地址的鏈接,來實現文件下載的,日後有需要的時候可以更換為動態的)
該類同樣是要繼承自ActionSupport
設置一些必要的屬性:
InputPath (讀取下載文件的目錄)
fileName (下載文件的文件名)
InputStream inputstream (讀取下載文件的輸入流)
ContentType (下載文件的類型)
需要創建InputStream輸入流
public InputStream getInputStream()throws FileNotFoundException {
String path=ServletActionContext.getServletContext().getRealPath(inputPath);
return new BufferedInputStream(new FileInputStream(path+"\\"+fileName));
}
省略get和set方法...
文件下載主要就是在struts.xml文件中的配置信息
<action name="down" class="cn.wz.upload.action.DownAction" >
<param name="inputPath">/upload</param>
<result name="success" type="stream">
<param name="contentType">application/msword</param>
<param name="inputName">inputStream</param>
<param name="contentDisposition">
attachment;filename="${fileName}"
</param>
<param name="bufferSize">4096</param>
</result>
</action>
在配置文件中,ContentType參數決定了下載問阿金的類型。不同的文件類型對應的參數值也是不同的。
ContentType對應的文件類型
文檔類型>>>ContentType設置
Word>>>Application/msword
Excel>>>Application/vnd.ms-excel
PPT>>>Application/vnd.ms-powerpoint
圖片>>>image/gif、image/bmp、image/jpeg
文本文件>>>text/plain
HTML網頁>>>text/html
可執行文件>>>application/octet-stream