使用hibernate框架来实现文件上传箱单简单,它提供了FileUpload拦截器用于解析multipart/form-data的编码请求。
此拦截器在struts2.core核心包中的struts-default.xml的defaultStack中,默认会执行。
在下图中可以看到fileupload拦截器是指向到FileUploadIntercepter类中的
进到这个类中可以看到其中有allowdExtensionSet是可以指定上传文件类型的。
按照JDBC规定找到其get方法
这个可以在struts.xml对应action中设置
.jpg,.jpeg,.png
需要注意的是在前台页面form表单中使用post提交方式和设置enctype="multipart/form-data"属性,input标签一定要指定name,这个name属性在action中会起到作用。
再说action中使用hibernate上传文件需要在其中定义三个属性并定义set方法,这里就要用到之前input中指定的name属性了,
第一个变量为File类型 变量名为name属性的值
第二个变量为String类型 变量名为 name属性的值+ContentType
第三个变量为String类型 变量名为 name属性的值+FileName
private File upload;
private String uploadContentType;
private String uploadFileName;
public void setUpload(File upload) {
this.upload = upload;
}
public void setUploadContentType(String uploadContentType) {
this.uploadContentType = uploadContentType;
}
public void setUploadFileName(String uploadFileName) {
this.uploadFileName = uploadFileName;
}
下面测试方法
public String add() throws IOException {
System.out.println(upload.getName());
System.out.println(uploadContentType);
System.out.println(uploadFileName);
return NONE;
}
这样可以获得File类型的对象、文件格式以及Sting类型的文件类型与文件名。
保存上传文件可以用apache的FileUtils类提供的copyFile方法来复制到新位置实现,具体代码如下:
/*
* 保存的文件对象
* D:\\www\\apache-tomcat-8.5.32\\webapps
*/
String filePath = "D:\\www\\apache-tomcat-8.5.32\\webapps\\upload\\images\\";
String fileName = filePath + FileUploadUtils.getUniqueFileName(uploadFileName);
File localFile = new File(fileName);
//使用apache的文件工具拷贝文件
FileUtils.copyFile(upload, localFile);
这里我使用了一个方法将原文件名改为了用UUID命名的随机文件名。
package utils;
import java.util.UUID;
/**
* 上传文件所需的工具类
* @author Administrator
*
*/
public class FileUploadUtils {
/*
* 将文件名组合成唯一文件名的方法
*/
public static String getUniqueFileName(String FileName) {
//获得文件后缀名
String[] split = FileName.split("\\.");
String suffix = "." + split[split.length - 1];
String randomUUID = UUID.randomUUID().toString().replaceAll("-", "");
// long currentTimeMillis = System.currentTimeMillis();
// return currentTimeMillis + suffix;
return randomUUID + suffix;
}
}
这样就可以将文件存储到相应的位置了,我存到了tomcat的webapps目录是为了方便引用。
要完善这个上传文件还需要有一些修改的地方:
在struts2.core核心包的default.properties中可以看到上传文件是有大小限制的,超过2M就会拒绝请求。
途中几个属性分解为:
* struts.multipart.parser=jakarta -- 默认文件上传解析器,就是FileUpload组件
* struts.multipart.saveDir= -- 文件上传的临时文件存储目录
* struts.multipart.maxSize=2097152 -- 文件上传的最大值(总大小),默认是2M
只设置总大小就可以,其他的先不用管。
在struts.xml中struts标签中设置常量,加一个0就是20M了。
同时在上传文件超过设置总大小的时候会报404错误找不到input action
这就需要在对应的action中设置一个name=input 的result,这样再有错误发生就会跳转至你指定的页面了,至于原因很复杂建议
查看相关文档。
/jsp/error.jsp
这样就完成了整个上传过程。