使用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>    //写到这里,文件上传这块儿就完成了。
               因为篇幅问题,这个文件上传就写到这里吧。
相关文章
相关标签/搜索