Struts2实现多文件上传-完整实例
Struts2实现多文件上传
实现原理
Struts 2是通过Commons FileUpload文件上传。Commons FileUpload通过将HTTP的数据保存到临时文件夹,然后Struts使用fileUpload拦截器将文件绑定到Action的实例中。从而我们就能够以本地文件方式的操作浏览器上传的文件。
解决方案
在开发Struts应用这前首先要为程序添加Struts支持,有两种方式添加Struts支持:用Myclipse添加方式;或者也可以手动添加。这也是开发Struts应用程序之前必须准备的工作。在这里我说一下用Myclipse添加的方式,在做文件上传这个例子时这也是用这种方式添加的。
(说明:我用的是Myclipse8.0版本)
给项目添加Struts支持步骤如下:
1、 à选择你的项目
2、 àMyclipse
3、 à选择Project Capalibities
4、 à选择Add Struts Capalibities…
(这样就为你的项目添加了Struts支持,是不是很简单呢)
1、创建uploadFiles.jsp页面,先将表单的提交方式设为POST,然后将enctype设为multipart/form-data。s
主要代码如下:
<s:form action="upload" method="post" enctype="multipart/form-data">
<table cellpadding="0" cellspacing="0" width="300px"
style="line-height: 40px; text-align: center;">
<tr>
<td>
<s:file name="upload" label="Image File1"></s:file>
</td>
</tr>
<tr>
<td>
<s:file name="upload" label="Image File2"></s:file>
</td>
</tr>
<tr>
<td>
<s:file name="upload" label="Image File3"></s:file>
</td>
</tr>
<tr>
<td>
<s:submit value=" 上 传 " />
</td>
</tr>
</table>
</s:form>
2、创建图片展示页面filesShow.jsp
主要代码如下:
<div style="width: 510px; border: 1px solid gray">
<div style="width: 25px; height: 155px; background-color: silver; float: left; text-align: center; color: teal">您上传的图片</div>
<center>
<s:iterator value="imageFiles" status="statu">
<div id="imgdiv">
<img alt="Struts2兑现多文件上传-完整实例" src="UploadImages/<s:property/>" width="150" height="145" ></div>
</s:iterator>
</center>
</div><br />
<button onclick=history.go(-1);>返回</button>
3、在WebRoot下创建UploadImages文件夹用于保存上传的文件
4、新建UploadFiles.java这个类的作用是用来将文件拷贝到UploadImages目录下
package com.upload.action;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class UploadFiles extends ActionSupport {
/**
*
*/
private static final long serialVersionUID = 1L;
private static final int BUFFERED_SIZE = 4 * 1024;
private File[] upload;
private String[] uploadFileName;
private String[] uploadContentType;
private String[] imageFiles;
public String[] getImageFiles() {
return imageFiles;
}
public File[] getUpload() {
return upload;
}
public void setUpload(File[] uploads) {
this.upload = uploads;
}
public String[] getUploadFileName() {
return uploadFileName;
}
public void setUploadFileName(String[] uploadFileNames) {
this.uploadFileName = uploadFileNames;
}
public String[] getUploadContentType() {
return uploadContentType;
}
public void setUploadContentType(String[] uploadContentTypes) {
this.uploadContentType = uploadContentTypes;
}
public String upload() {
String fileType = null;//定义输入流
String fileName = "";//输出流
imageFiles=new String[upload.length];
for (int i = 0; i < upload.length; i++) {
fileType = uploadFileName[i].substring(uploadFileName[i]
.lastIndexOf("."));
fileName = (new Date().getTime()+i+1)+ fileType;
imageFiles[i]=fileName;
File imageFile = new File(ServletActionContext.getServletContext()
.getRealPath("/UploadImages")
+ "/" + fileName);
copy(upload[i], imageFile);
}
return "filesShow";
}
private static void copy(File src, File target) {
InputStream in = null;
OutputStream out = null;
try {
in = new BufferedInputStream(new FileInputStream(src),
BUFFERED_SIZE);
out = new BufferedOutputStream(new FileOutputStream(target),
BUFFERED_SIZE);
byte[] b = new byte[BUFFERED_SIZE];
while (in.read(b) > 0) {
out.write(b);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
if (in != null)
in.close();
if (out != null)
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
大家应该注意到,在这个UploadFiles.java类中我写了SetUpload, SetUploadFileName, SetUploadContentType,这几个方法。这是起什么作用呢?
聪明的你应该想到了吧,其实这几个方法是用来绑定要上传的文件的。这个这个upload就是对应uploadFiles.jsp页面的<s:file name="upload" label="Image File1"></s:file>。而imageFiles属性是用来在上传成功后展示用的。
5、 配置struts.xml配置文件
<action name="*" method="{1}">
<interceptor-ref name="fileUpload"><!-- 用于文件上传的拦截器 -->
<param name="allowedTypes"><!-- 允许上传的文件类型 -->
image/pjpeg,image/png,image/gif,image/bmp</param>
<param name="maximumSize">2097152</param><!-- 允许上传最大文件大小 -->
</interceptor-ref>
<interceptor-ref name="defaultStack" /><!-- 验证拦截器 -->
<interceptor-ref name="token"></interceptor-ref>
<result name="filesShow">/filesShow.jsp</result>
<result name="invalid.token">/filesShow.jsp</result>
<result name="input">/uploadFiles.jsp</result>
</action>
6、 Web.xml主配置
<filter>
?? <filter-name>struts2</filter-name>
?? <filter-class>
?? org.apache.struts2.dispatcher.FilterDispatcher
?? </filter-class>
? </filter>
? <filter-mapping>
?? <filter-name>struts2</filter-name>
?? <url-pattern>/*</url-pattern>
? </filter-mapping>
整个项目的框架结构如下图:
总结
Struts2实现文件上传就是这么简单,只要把<s:file name="XX" />和Action的属性绑定就OK.
?
注释:转自http://blog.csdn.net/kaixin123456789/article/details/6548240
?
?