版权声明:本文为博主原创文章,如需转载,请标明出处。 https://blog.csdn.net/alan_liuyue/article/details/79390681
简介
1.上一篇博客讲解了JFinal框架单文件、多文件上传代码,那么本篇博客将会介绍struts2框架单文件、多文件上传;
2.struts2框架本身就已经封装了文件获取和解析的特有的方法,所以,我们之需要将这些方法熟练运用展示出即可;
3.本篇实例将会分成四个步骤,给您展示一步到位的完善的struts2框架文件上传:
(1).需要的jar包;
(2).jsp页面;
(3).xml配置;
(4).后台controller处理方法;
实例
1.需要提供的jar包:commons.fileupload-1.2.1.jar; commons.io-1.4.0.jar
2.jsp页面:
<!-- enctype 默认是 application/x-www-form-urlencoded -->
<form action="address_upload" enctype="multipart/form-data" method="post" >
地址:<input type="text" name="addressName"> <br/>
上传文件:<input type="file" name="address"><br/>
<input type="submit" value="提交"/>
</form>
<!--注意:要在form标签中加上enctype="multipart/form-data"表示该表单是要处理文件的,
这是最基本的东西,很多人会忘记然而当上传出错后则去找程序的错误,却忘了这一点 -->
3.xml文件配置:
<!--说明:
* Struts2的文件上传其实也是通过拦截器来实现的,只是该拦截器定义为默认拦截器了,所以不用自己去手工配置,
* <interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/>
-->
<struts>
<!--解决乱码 -->
<constant name="struts.i18n.encoding" value="UTF-8" />
<!-- 指定允许上传的文件最大字节数。默认值是2097152(2M) -->
<constant name="struts.multipart.maxSize" value="2147483648" />
<!-- 设置上传文件的临时文件夹,默认使用javax.servlet.context.tempdir -->
<constant name="struts.multipart.saveDir " value="d:/tmp" />
<!--action内部配置:-->
<action name="address_*" class="articleAction" method="{1}">
<interceptor-ref name="fileUpload">
<!-- 文件过滤,不写则不会对文件进行过滤 -->
<param name="allowedTypes">image/bmp, image/x-png,image/png, image/gif, image/jpeg</param>
<!-- 文件大小, 以字节为单位,必须小于全局的struts.multipart.maxSize大小配置 -->
<param name="maximumSize">1073741824</param>
</interceptor-ref>
<!-- 默认拦截器必须放在fileUpload之后,否则无效 -->
<interceptor-ref name="defaultStack" />
</action>
</struts>
4.后台controller处理方法类:
一、struts2单文件上传
1、创建set和get方法,用于自动匹配前台数据:
@Controller
public class AddressAction extends ActionSupport{
//具体上传文件的引用, 指向临时目录中的临时文件
private File address;
// 上传文件的名字 ,在file名称address后面添加FileName,固定的写法
private String addressFileName;
// 上传文件的类型,在file名称address后面添加ContentType,固定的写法
private String addressContentType;
public File getAddress() {
return address;
}
public void setAddress(File address) {
this.address = address;
}
public String getAddressFileName() {
return addressFileName;
}
public void setAddressFileName(String addressFileName) {
this.addressFileName = addressFileName;
}
public String getAddressContentType() {
return addressContentType;
}
public void setAddressContentType(String addressContentType) {
this.addressContentType = addressContentType;
}
}
2、创建处理文件的action
/**
* 上传文件其实是上传了两份,
*
* 首先将上传的文件保存到 default.properties 文件中 struts.multipart.saveDir键指定的目录中
* 默认是空的
* 保存在 Tomcat 6.0\work\Catalina\localhost\struts2目录下以.tmp后缀名的文件
*
* 如果要在 struts.multipart.saveDir 指定目录, 则可以在 src文件夹下 建一个 struts.properties,
* 覆盖 default.properties 的某些键值
*
* 还有一份是 存放在自己设定的目录下
*/
public String upload(){
//测试获取到的文件信息
System.out.println("文件名称:"+addressFileName);
System.out.println("文件类型:"+addressContentType);
//获取项目保存文件的根目录
String savePath = ServletActionContext.getServletContext().getRealPath("/uploadFile/placeImage");
//根据原文件名使用时间戳和随机数重命名,保存
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss");
String lastThreeLetter = addressFileName.substring(addressFileName.lastIndexOf("."));
String sqlName = sdf.format(new Date())+(int)(Math.random()*10000)+lastThreeLetter;
//根据根目录和文件名,创建新的文件路径
File saveFile = new File(savePath+File.separator+sqlName); //new File(savePath,sqlName);
//编写输入流方法,读取文件
InputStream is=new FileInputStream(getAddress()); //读取文件
//编写输出流方法,保存文件
OutputStream os=new FileOutputStream(saveFile);
byte buffer[]=new byte[1024];
int length=0;
while((length=is.read(buffer))>0){
os.write(buffer, 0, length);
}
os.close();
is.close();
//返回json数据,这里由于有文件传输,所以需要返回html格式,在前台使用JSON.parse(data)转换成json
response.setContentType("text/html");
String data="{\"result\":\"success\"}";
response.getWriter().print(data);
return null;
}
二、struts2多文件上传:
1、创建set和get方法,用于自动匹配前台数据:
/**
* 因为是多文件,所以需要使用list集合接收,然后进行遍历解析
*/
@Controller
public class AddressAction extends ActionSupport{
//具体上传文件的引用, 需和前台的name属性一致, 指向临时目录中的临时文件
private List<File> address;
// 上传文件的名字 ,在file名称address后面添加FileName,固定的写法
private List<String> addressFileName;
// 上传文件的类型,在file名称address后面添加ContentType,固定的写法
private List<String> addressContentType;
public List<File> getAddress() {
return address;
}
public void setAddress(List<File> address) {
this.address = address;
}
public List<String> getAddressFileName() {
return addressFileName;
}
public void setAddressFileName(List<String> addressFileName) {
this.addressFileName = addressFileName;
}
public List<String> getAddressContentType() {
return addressContentType;
}
public void setAddressContentType(List<String> addressContentType) {
this.addressContentType = addressContentType;
}
}
2.创建处理多文件的action
/**
* 获取和保存的方式和单文件差不多,只是多文件多了一个遍历的功能
* 文件的重命名功能可以封装成一个工具类
*/
public String upload(){
//获取项目保存文件的根目录
String savePath = ServletActionContext.getServletContext().getRealPath("/uploadFile/placeImage");
//格式化时间戳命名
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss");
String timePath = sdf.format(new Date());
//循环读取文件,同时写入文件
for(int i = 0 ; i < address.size() ; i++ )
{
//获取文件,添加时间戳和随机数对文件重命名
String lastThreeLetter = addressFileName.get(i).substring(addressFileName.lastIndexOf("."));
String sqlName = timePath + (int)(Math.random()*10000)+lastThreeLetter;
//根据根目录和文件名,创建新的文件路径
File saveFile = new File(savePath+File.separator+sqlName); //new File(savePath,sqlName);
//编写输入流方法,读取文件
InputStream is = new FileInputStream(address.get(i));
//OutputStream os = new FileOutputStream(new File(path,addressFileName.get(i))); //直接使用原文件的文件名保存
//编写输出流方法,保存文件
OutputStream os=new FileOutputStream(saveFile);
byte buffer[]=new byte[1024];
int length=0;
while((length=is.read(buffer))>0){
os.write(buffer, 0, length);
}
os.close();
is.close();
}
//返回json数据,这里由于有文件传输,所以需要返回html格式,在前台使用JSON.parse(data)转换成json
response.setContentType("text/html");
String data="{\"result\":\"success\"}";
response.getWriter().print(data);
return null;
}
总结
1.以上就是struts2框架单文件、多文件上传的全部流程,代码也是简洁方便,对于还不是很了解struts2上传文件的程序猿还是有帮助的,有需要的可以自行复制代码,然后可以经过自己的进一步加工,形成对自己最有效的一套代码;
2.实践是检验认识真理的唯一标准,代码好不好用,何不亲自动手实践看看;