使用Struts2實現文件的上傳與動態下載
本篇主要使用Struts2實現文件的上傳與動態下載功能。出于安全考慮,所以,在硬盤上存儲上傳的文件的時候,統一都重新命名為隨機字符串。用數據庫存儲真實文件名與隨機文件名稱之間的關聯。
下面的是實體類
public class FileBag implements java.io.Serializable {
// Fields
private Integer id; //Id編號
private String filePath; //文件存儲路徑(真實的文件被重命名后的名稱)
private Date fileIndate; //文件上傳日期
private Integer downloadCount; //文件下載次數
private String fileMark; //文件備注,說明
private String fileSize; //文件大小
private String fileType; //文件類型
private String fileName; //真實的文件名稱
//getter 和setter省略
} 然后寫頁面,頁面其實很簡單:
<form method="post" action="fileUploadAction.action" enctype="multipart/form-data">
<div id="chooser">
文 件:<input id="file" type="file" name="file"/><br/>
文件描述:<textarea id="fileremark" name="fileremark"></textarea><br/>
</div>
<input type="submit" value="上傳"/>
</form> 然后寫Action,前面提到過,出于安全考慮,所以,在硬盤上存儲上傳的文件的時候,統一都重新命名為隨機字符串。用數據庫存儲真實文件名與隨機文件名稱之間的關聯。
package com.action;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;
import java.util.List;
import org.apache.struts2.ServletActionContext;
import org.springframework.beans.factory.annotation.Autowired;
import com.common.base.BaseAction;
import com.common.util.Configuration;
import com.common.util.FileExtensionHelper;
import com.common.util.StringUtils;
import com.entity.FileBag;
import com.opensymphony.xwork2.ModelDriven;
import com.service.FileBagService;
//該類支持多文件上傳
public class FileUploadAction extends BaseAction {
@Autowired
private FileBagService fileBagService;
private List<File> file;//Struts2文件上傳不可缺少
private List<String> fileFileName;//Struts2文件上傳不可缺少
private List<String> fileContentType;//Struts2文件上傳不可缺少
private List<String> fileremark;
public List<File> getFile() {
return file;
}
public void setFile(List<File> file) {
this.file = file;
}
public List<String> getFileFileName() {
return fileFileName;
}
public void setFileFileName(List<String> fileFileName) {
this.fileFileName = fileFileName;
}
public List<String> getFileContentType() {
return fileContentType;
}
public void setFileContentType(List<String> fileContentType) {
this.fileContentType = fileContentType;
}
/**
* 執行文件上傳的操作,會自動生成一個帶隨機文件名的字符串來防止重復文件。
*/
public String execute() throws Exception {
for (int i = 0; i < file.size(); i++) {
FileBag fileBag = new FileBag(); //創建一個新的實例存儲文件信息
fileBag.setFileIndate(new Date()); //設定文件上傳日期
fileBag.setFileMark(fileremark.get(i)); //設定文件的備注信息
fileBag.setFileName(fileFileName.get(i)); //設定文件的真實名稱
fileBag.setDownloadCount(0); //設定文件下載次數為0
fileBag.setFileSize(file.get(i).length()+"");
String fileRandomName = StringUtils.randomString(20); //隨機產生文件名稱的字符串
fileBag.setFilePath(fileRandomName); //設定文件的隨機名稱
fileBag.setFileType(this.fileContentType.get(i)); //設定文件類型
InputStream in = new FileInputStream(file.get(i));
//從Configuration類中獲取設定的文件存儲路徑(常量),下載的時候也會用到這個存儲地址
String root = Configuration.getValue("fileSaveDir");
File file = new File(root);
if(!file.exists()){//如果目錄不存在,則會重新創建目錄
file.mkdirs();
System.out.println("重新創建目錄!");
}
File destFile = new File(root, fileRandomName);
OutputStream out = new FileOutputStream(destFile);
byte[] b = new byte[1024];
int length = 0;
while ((length = in.read(b)) > 0) {
out.write(b, 0, length);
}
in.close();
out.close();
fileBagService.save(fileBag);
}
this.msg=this.file.size()+"個文件上傳成功!";
return SUCCESS;
}
public List<String> getFileremark() {
return fileremark;
}
public void setFileremark(List<String> fileremark) {
this.fileremark = fileremark;
}
} 設定Struts2的配置
struts.multipart.saveDir=D\:\\ 設定臨時文件存儲位置 struts.multipart.maxSize=105591603200 //設置文件最大上傳多少兆,這里單位是字節
Struts.xml中對Action的配置
<!-- 文件上傳 -->
<action name="fileUploadAction" class="com.action.FileUploadAction">
<result name="success">/file/fileupload.jsp</result>
<result name="input">/file/fileupload.jsp</result>
</action> //寫到這里,文件上傳這塊兒就完成了。
由于篇幅問題,這個文件上傳就寫到這里吧。 本文由用戶 fmms 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!