您的位置:首页 > 编程语言 > Java开发

Struts2之文件上传

2016-02-01 20:37 495 查看
由于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>

在这里没有连接数据库,只是单纯的将文件保存到磁盘上,然后跳转到成功界面。在实际开发中,可以将文件保存到磁盘上,然后将保存文件的目录,保存到数据库中,之后根据数据库中保存的目录,即可做文件下载的功能。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  struts2.0 文件上传