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

Struts2实现多文件上传

2011-01-13 22:41 381 查看
实现原理
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:form action="upload" method="post" enctype="multipart/form-data">
<s:token />
<table cellpadding="0" cellspacing="0" width="300px"
style="line-height: 40px; text-align: center;" mce_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="" src="UploadImages/<s:property/>" width="150"height="145" >
</div>
</s:iterator>
</center>
</div>
<br />
<button onclick=history.go(-1);>返回</button>


3、在WebRoot下创建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="*" class="com.upload.action.UploadFiles" 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.

4、新建UploadFiles.java这个类的作用是用来将文件拷贝到UploadImages目录下
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: