本篇主要使用Struts2實現文件的上傳與動態下載功能。出於安全考慮,因此,在硬盤上存儲上傳的文件的時候,統一都從新命名爲隨機字符串。用數據庫存儲真實文件名與隨機文件名稱之間的關聯。html
下面的是實體類java
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省略 }
而後寫頁面,頁面其實很簡單: spring
<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的配置apache
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> //寫到這裏,文件上傳這塊兒就完成了。 因爲篇幅問題,這個文件上傳就寫到這裏吧。