使用Struts2實現文件的上傳與動態下載(1)

本篇主要使用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">
    文&nbsp;&nbsp;&nbsp;&nbsp;件:<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>    //寫到這裏,文件上傳這塊兒就完成了。
               因爲篇幅問題,這個文件上傳就寫到這裏吧。
相關文章
相關標籤/搜索