Struts2之文件上传

由于Struts2已经对文件上传进行了封装,所以较为简单,导入Struts2相应的java包,commons-fileupload.jar、commons-io.jar是其依赖的jar包。

使用Struts2的文件上传主要有一下步骤:

(1)定义文件上传的表单,包含文件上传表单项<input type="file" name="file">。

(2)在form上将enctype属性设置为"multipart/form-data",设置提交方式为post,设置提交的action地址

(3)定义一个Struts2的Action类,在struts.xml上配置好。

(4)在Action类中添加File属性的属性,生成get和set方法。

以下为JSP部分代码:其中文件上传标签的name属性为file

<form action="upload/upload" enctype="multipart/form-data" method="post">
    	文件:<input type="file" name="file"> </br>
    	<input type="submit" value="上传">
    </form>


以下为Action部分代码:

第6行,定义了一个名为file,类型为File的action属性。用于存放上传的文件。只要保证属性名称和页面中文件上传标签的name属性一致,并有set方法,Struts2就会自动将上传的文件的文件保存到临时目录下,并将临时目录下的文件设置到属性中。第7行,定义一个String类型的属性,用于存放上传的文件名,也是有Struts2自动设置,属性名的命名规则为:页面文件标签的name属性值后面跟上FileName。第8行,定义一个String类型的属性,用于存放上传文件的MIME类型,命名规则为也是跟上ContentType后缀。

/**
 * 文件上传
 * @author lzx
 */
public class FileUpload extends ActionSupport {
	private File file;
	private String fileFileName;
	private String fileContentType;

	public File getFile() {
		return file;
	}

	public void setFile(File file) {
		this.file = file;
	}

	public String getFileFileName() {
		return fileFileName;
	}

	public void setFileFileName(String fileFileName) {
		this.fileFileName = fileFileName;
	}

	public String getFileContentType() {
		return fileContentType;
	}

	public void setFileContentType(String fileContentType) {
		this.fileContentType = fileContentType;
	}

	/**
	 * 处理文件上传,将上传的文件保存到指定路径下。
	 * 防止文件名重复需加上UUID前缀
	 * 防止同一个目录下文件过多,需将文件目录打散
	 * @return 上传成功返回success
	 * @throws Exception
	 */
	public String Upload() throws Exception {
		//得到文件保存的路径
		String rootPath = ServletActionContext.getServletContext().getRealPath("/WEB-INF/files");
		
		//处理文件名中包含绝对路径的问题
		String fileName  = fileFileName;
		int index = fileName.lastIndexOf("\\");
		if (index != -1) {
			fileName = fileName.substring(index + 1);
		}
		
		//给文件名称添加UUID前缀,处理文件同名问题
		String saveName = UUID.randomUUID().toString() + "_" + fileName;
		
		//得到HashCode,转换成16进制
		int code = fileName.hashCode();
		String hex = Integer.toHexString(code);
		
		//获取hex的前两个字母,和root目录连接变成文件保存的目录
		String savePath = rootPath + "\\" + hex.charAt(0) + "\\" + hex.charAt(1);
		File dirFile = new File(savePath);
		
		//如果不存在则创建目录
		if (!dirFile.exists()) {
			dirFile.mkdirs();
		}
		
		//创建目标文件,指定其所在路径
		File destFile = new File(dirFile, saveName);
		
		//保存文件到指定目录下
		FileUtils.copyFile(file, destFile);
		
		return SUCCESS;
	}
}

第45-50行,为了解决有些上传的文件名中带有绝对路径,所以需要对文件名进行判断,如果带有绝对路径,需要进行字符串切割。第53行,为了防止上传同名文件可能会覆盖原有的文件,所以为文件名加上UUID的前缀,并用_分割,方便之后可以切割获得真是的文件名。第59-66行,根据文件名的Hash值,转换成16进制,去前两个字符与根目录一起构造文件保存的路径。如果直接把文件放在同一个目录下,那么日积月累,该目录下的文件数量过大,访问速度就会变慢,所以把文件保存的目录打散,防止同个目录文件数目过大。

如果要上传多个文件,只要把action中的File属性改为File[] 数组形式,将保存文件名和文件MIME类型的属性也改成数组形式,或者使用List形式即可。之后保存的时候,只要遍历文件数组,做相应的操作。注意,如果上传的文件过大,Struts2会报错,因为Struts2默认的上传文件大小只有2M多,如果要上传大文件,可以在struts.xml下面配置常量

<!-- 指定Struts2文件上传中整个请求内容允许的最大字节量 -->
	<constant name="struts.multipart.maxSize" value="15728640"></constant>

在这里没有连接数据库,只是单纯的将文件保存到磁盘上,然后跳转到成功界面。在实际开发中,可以将文件保存到磁盘上,然后将保存文件的目录,保存到数据库中,之后根据数据库中保存的目录,即可做文件下载的功能。




  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值