Struts2框架的檔案上傳--common-fileupload
Struts2框架預設使用了Common-fileUpload元件,該元件將解析出HttpservletRequest請求中的檔案域資訊,並使用IO資料流的方式,將檔案儲存在伺服器的指定位置,完成檔案
上傳。
1、 Commons-IO是一個非常有用的IO工具包,主要包括下面3個方面:
Utility classes:提供靜態方法來完成通用的任務。
Filters:提供豐富功能的檔案過濾器。
Streams:執行reader和writer有用的Stream。
2、 檔案上傳的JSP頁面
在JSP中,form標籤的enctype屬性應設定為multipart/form-data。
Form表單的enctype屬性用來指定表單資料的編碼方式,有如下3個:
application/x-www-form-urlencoded:如果指定該值,則表單中的資料被編碼為Key-Value對,即預設的編碼方式。
multipart/form-data:即使用mine編碼,會以二進位制流的方式來處理表單資料,檔案上傳需要使用該編碼方式。
text/plain:表單資料以純文字形式進行編碼,其中不含任何控制元件或格式符。
3、 檔案上傳的Action
public class FileUploadAction extends ActionSupport {
private File doc;//封裝上傳檔案的屬性
private String fileName;//封裝上傳檔案的名稱屬性
private String contentType;//封裝上傳檔案的型別屬性
private String dir;//儲存檔案路徑屬性
private String targetFileName;//儲存檔名稱屬性
public void setDoc(File file) {
this.doc = file;
}
public void setDocFileName(String fileName) {
this.fileName = fileName;
}
public void setDocContentType(String contentType) {
this.contentType = contentType;
}
……省略部分getter和setter方法
public String execute() throws Exception{
String realPath = ServletActionContext.getRequest().getRealPath("/upload");
String targetDirectory=realPath;
targetFileName=generateFileName(fileName);//生成儲存檔案的名稱
setDir(targetDirectory+"//"+targetFileName);//儲存檔案的路徑
File target=new File(targetDirectory,targetFileName);//建立一個目標檔案
FileUtils.copyFile(doc, target);//將臨時檔案複製到目標檔案
return SUCCESS;
}
//為上傳檔案自動分配檔名稱,避免重複
private String generateFileName(String fileName){
DateFormat format=new SimpleDateFormat("yyMMddHHmmss");
String formatDate=format.format(new Date());
int random=new Random().nextInt(10000);//隨即生成檔案編號
int position=fileName.lastIndexOf(".");//得到檔名中"."的位置
System.out.println(fileName);
System.out.println(position);
String extension=fileName.substring(position);//得到檔案的副檔名
System.out.println(extension);
return formatDate+random+extension;
}
}
該Action中定義了一個File型別的doc屬性,用來對應JSP中表單中檔案域的name值。同時定義了兩個非常重要的屬性:fileName和contentType,這三個屬性封裝了檔案上傳的相關資訊:
File型別的doc屬性封裝了該檔案域對應的檔案內容。
String型別的fileName屬性封裝了該檔案域對應的檔名。
String型別的contentType屬性封裝了該檔案域對應的檔案型別。
注意: 實際上Action中是使用setter來封裝檔案域的3個引數的。如果該檔案域name值
為xxx,則Action中使用setXxx()來封裝File型別的檔案內容;使用setXxxFileName()來
封裝檔名稱;使用setXxxContentType()來封裝檔案型別。只要Action定義了上面的3
個方法,就能夠在execute()方法中獲得相關資訊。
最好在struts.properties中定義如下常量:
struts.multipart.saveDir= /tmp
這樣上傳的檔案就會臨時儲存到伺服器根目錄下的tmp資料夾中,如果資料夾不存在,Struts2會自動建立一個。
4、 上傳檔案過濾
為了防止使用者上傳木馬等病毒,需要限制上傳檔案的檔案型別;為了防止伺服器空間不足,需要限制使用者上傳檔案的大小等。
Struts2框架內建了一個檔案上傳攔截器。該檔案上傳攔截器名稱為fileUpload,只要在配置Action時引用該攔截器就可以實現相應的檔案過濾。 以下為示例:
<action name="upload" class="fileUpLoad.FileUploadAction">
<interceptor-ref name="fileUpload">
<!—allowedTypes引數指定允許上傳的檔案型別 -->
<param name="allowedTypes">
text/plain, iamge/bmp,image/ppng,image/pjpeg,iamge/gif,image/pjpeg,image/tiff
</param>
<!—maximumSize 引數指定了上傳檔案的最大容量(單位位元組)-->
<param name="maximumSize">10000000</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
<result name="success">/fileUpLoad/uploadSuccess.jsp</result>
<result name="input">/fileUpLoad/fileUpload.jsp</result>
</action>
相關文章
- Struts2的檔案上傳下載
- struts2 檔案上傳為空
- 菜鳥學SSH(五)——Struts2上傳檔案
- Struts2教程7:上傳任意多個檔案
- go的gin框架使用(六):檔案上傳Go框架
- struts2檔案上傳型別限制 之 zip和rar檔案型別型別
- php檔案上傳之多檔案上傳PHP
- struts2上傳多個檔案,下載 配製!程式碼
- JAVA Web 之 struts2檔案上傳下載演示(一)(轉)JavaWeb
- struts2 檔案上傳和下載,以及部分原始碼解析原始碼
- java struts2結合swfupload實現上傳檔案的demo教程Java
- 檔案上傳之三基於flash的檔案上傳
- 單個檔案上傳和批量檔案上傳
- 檔案上傳
- 上傳檔案的陷阱
- SpringMVC 單檔案上傳與多檔案上傳SpringMVC
- 【SSH2(實踐篇)】--Struts2檔案上傳下載例項
- Java大檔案上傳、分片上傳、多檔案上傳、斷點續傳、上傳檔案minio、分片上傳minio等解決方案Java斷點
- 前端大檔案上傳/分片上傳前端
- Flask——檔案上傳Flask
- PHP上傳檔案PHP
- JavaScript 檔案上傳JavaScript
- Git上傳檔案Git
- YII檔案上傳
- 檔案上傳概述
- beego上傳檔案Go
- 上傳檔案流程
- 上傳EXCLE檔案
- PHP 檔案上傳PHP
- 檔案上傳漏洞
- Laravel 中的檔案上傳Laravel
- 檔案上傳的異常
- 上傳檔名為中文的檔案
- AngularJS實現的檔案檔案上傳AngularJS
- MVC檔案上傳 - 使用Request.Files上傳多個檔案MVC
- .NET Core 如何上傳檔案及處理大檔案上傳
- Spring MVC 檔案上傳、Restful、表單校驗框架SpringMVCREST框架
- Django檔案上傳 -- 適用於單一小檔案上傳Django