版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37992075/article/details/77155943
为了我们在开发中的文件上传变得更加简便,struts2框架为我们提供了HTML中form表单的文件上传的功能,使用和配置起来及其方便,很大的提升了开发效率!
struts2的文件上传也是基于拦截器来实现的,在我们的前端HTML中的form表单提交到Action来的时候,会把使用拦截 器把提交请求拦截起来,然后再做相应的上传处理,上传一个文件时,它通常会被存储在一个临时目录中,并且把临时文件路 径、文件类型、文件名赋给Action中相对应的变量,再由我们在Action中对文件进行处理或移动到一个永久的目录,以确保数据不 丢失。
二、创建文件上传Action类
1、**单文件上传**
1、对应的html代码
<form action="upload.action" method="post" enctype="multipart/form-data">
<input type="file" name="myFile" />
<input type="submit"/>
</form>
2、文件上传action类
package com.example.action;
import java.io.File;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.convention.annotation.Action;
public class UploadAction {
//设置三个默认的属性
//这里的文件名要与表单中的 file的name属性一致
private File myFile;
private String myFileContentType;//上传文件的类型
private String myFileFileName; //文件名
public String upload() throws Exception{
HttpServletRequest request=ServletActionContext.getRequest();
String uploadPath=request.getRealPath("/upload"); //获得项目中upload的路径
UUID uuid=UUID.randomUUID();//获得一个唯一标识符用来作为上传后的文件名
String newFileName=uuid.toString();
String suffix=myFileFileName.substring(myFileFileName.lastIndexOf(".");//截取后缀名
File destFile=new File(uploadPath+"/"+newFileName+suffix); //destFile是我们要移动到的目标文件
FileUtils.copyFile(myFile, destFile);//将struts2给我们的myFile临时文件复制到destFile目标文件
return "success";
}
public File getMyFile() {
return myFile;
}
public void setMyFile(File myFile) {
this.myFile = myFile;
}
public String getMyFileContentType() {
return myFileContentType;
}
public void setMyFileContentType(String myFileContentType) {
this.myFileContentType = myFileContentType;
}
public String getMyFileFileName() {
return myFileFileName;
}
public void setMyFileFileName(String myFileFileName) {
this.myFileFileName = myFileFileName;
}
}
这里是我们自己创建的单文件上传Action类,和其他action类不同的是,这个类我们要设定几个struts2默认的属性,并且给出 set/get方法。创建action类之前,我们先要保证HTML中的form表单中的 enctype属性值要设为multipart/ form-data(以数据二进制 的类型上传)
2、**多文件上传**
1、对应的html代码
<form action="upload.action" method="post" enctype="multipart/form-data">
<input type="file" name="myFile" />
<input type="file" name="myFile" />
<input type="submit"/>
</form>
2、文件上传action类
package com.example.action;
import java.io.File;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.convention.annotation.Action;
public class UploadAction {
//这里的文件名要与表单中的 file的name属性一致
private List<File> myFile;
private List<String> myFileContentType;//上传文件的类型
private List<String> myFileFileName; //文件名
public String upload() throws Exception{
HttpServletRequest request=ServletActionContext.getRequest();
String uploadPath=request.getRealPath("/upload"); //获得项目中upload的路径
for(int i=0;i<myFile.size();i++){
UUID uuid=UUID.randomUUID();//获得一个唯一标识符用来作为上传后的文件名
String newFileName=uuid.toString();
String suffix=myFileFileName.get(i).substring(myFileFileName.get(i).lastIndexOf(".");//截取后缀名
File destFile=new File(uploadPath+"/"+newFileName+suffix); //destFile是我们要移动到的目标文件
FileUtils.copyFile(myFile.get(i), destFile);//将struts2给我们的myFile临时文件复制到destFile目标文件
}
return "success";
}
public List<file> getMyFile() {
return myFile;
}
public void setMyFile(List<file> myFile) {
this.myFile = myFile;
}
public List<String> getMyFileContentType() {
return myFileContentType;
}
public void setMyFileContentType(List<String> myFileContentType) {
this.myFileContentType = myFileContentType;
}
public List<String> getMyFileFileName() {
return myFileFileName;
}
public void setMyFileFileName(List<String> myFileFileName) {
this.myFileFileName = myFileFileName;
}
}
这里多文件上传action类的原理其实是一样的,只是,把我们设置的属性改成List,我们多文件上传的时候要注意,HTML表单里面的file类型的input标签的name属性都要设为与action中File类型的List属性名一致。
三、配置文件
我们上面所讲的都是使用struts2的默认配置上传的,并没有配置上传文件的大小,类型等,单在我们平常的开发中都是需啊这些设置的。
设置上传大小,上传文件类型
<action name="upload" class="com.example.action.UploadAction" method="upload">
<interceptor-ref name="defaultStack">
<param name="fileUpload.maximumSize">20000</param><!-- 以字节为单位 -->
<param name="fileUpload.allowedTypes">image/gif,image/jpg</param>
</interceptor-ref>
<result name="success">/index.jsp</result>
</action>
如果我们要上传 zip,rar压缩包的话,fileUpload.allowedTypes中的配置可改为如下,为了保证浏览器兼容,建议全部设置上
zip文件
firefox : application/octet-stream
chrome : application/octet-stream
oprea : application/zip
IE : application/x-zip-compressed
rar文件
firefox : application/x-rar-compressed
chrome : application/octet-stream
oprea : application/x-rar-compressed
四、错误信息
fileUplaod拦截器使用几个默认的错误消息:
1、struts.messages.error.uploading
无法上传文件时发生的一般错误。
2、struts.messages.error.file.too.large
当上传的文件太大时,由maximumSize指定。
3、struts.messages.error.content.type.not.allowed
当上传的文件与指定的预期文件类型不匹配时发生。