Struts2之文件上传

来源:互联网 发布:mac 终端连接linux 编辑:程序博客网 时间:2024/06/06 01:23

由于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>

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




0 0
原创粉丝点击