环境:tomcat5.5+eclipse3.2
首先编写Action:
1.上传Action:UploadAction.java
public class UploadAction extends ActionSupport {
private List<String> picFileName;// 上传文件名称集合
private List<File> pic;// 上传文件(临时文件)
private List<String> picContentType;// 上传的文件的类型集合
private String savePath; //"<param name="savePath">/upload</param>"为上传文件的存放路径
private String allowedTypes; //获取上传文件允许的路径
private Long maximumSize;
private List<Long> fileSize;
public Long getMaximumSize() {
return maximumSize;
}
public void setMaximumSize(Long maximumSize) {
this.maximumSize = maximumSize;
}
public List<Long> getFileSize() {
return new ArrayList<Long>();
}
public void setFileSize(List<Long> fileSize) {
this.fileSize = fileSize;
}
public String getSavePath() {
System.out.println("savaPath:"+ServletActionContext.getRequest().getRealPath(savePath));
return ServletActionContext.getRequest().getRealPath(savePath);
}
public void setSavePath(String savePath) {
this.savePath = savePath;
}
public String getAllowedTypes() {
return allowedTypes;
}
public void setAllowedTypes(String allowedTypes) {
this.allowedTypes = allowedTypes;
}
public List<String> getPicFileName() {
return picFileName;
}
public void setPicFileName(List<String> picFileName) {
this.picFileName = picFileName;
}
public List<File> getPic() {
return pic;
}
public void setPic(List<File> pic) {
this.pic = pic;
}
public List<String> getPicContentType() {
return picContentType;
}
public void setPicContentType(List<String> picContentType) {
this.picContentType = picContentType;
}
/**
* 过滤文件类型
*/
public String filterType(String[] types) {
// 获取上传的文件类型
List<String> fileType = getPicContentType();
for (String type : types) {
for (String fType : fileType) {
if (type.equals(fType)) {
return null;
}
}
}
return "input";
}
/**
* 过滤文件大小
*/
public String filterSize(List<Long> size){
for(Long s:getFileSize()){
if(s>getMaximumSize()){
return null;
}
}
return "input";
}
public String execute() throws Exception{
if (pic == null) {
this.addFieldError("error", "请选择要上传的文件!");
return "input";
} else {
String filterResult = filterType(getAllowedTypes().split(","));//持有允许上传的文件类型
// 如果当前类型不允许上传
if (filterResult != null) {
this.addFieldError("typeError", "上传的文件类型不正确!");
return filterResult;
}
for (int i = 0; i < pic.size(); i++) {
// 循环上传每个文件
//查看文件大小
getFileSize().add(pic.get(i).length());
String filterSize = filterSize(fileSize);
if(fileSize!=null){
this.addFieldError("sizeError", "上传"+picFileName.get(i)+"文件太大!");
return filterSize;
}
uploadFile(i);
}
}
return "success";
}
// 实现上传功能
//Struts2上传文件的默认大小限制是2M(2097152字节),
//也可以通过struts.properties文件中的struts.multipart.maxSize修改,
//如struts.multipart.maxSize=102400 表示一次上传文件的总大小不能超过100K字节。
//另一种改变上传属性的方式是在struts.xml中配置constant。本文采用后者。
/**
* 上传多个文件
*/
private void uploadFile(int i) {
try {
/** 用于存放上传文件的路径
E:/Myspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/F//upload
*/
FileInputStream file = new FileInputStream(getPic().get(i));
FileOutputStream newFile = new FileOutputStream(getSavePath() + "//"
+ getPicFileName().get(i));
BufferedInputStream in = new BufferedInputStream(file);
BufferedOutputStream out = new BufferedOutputStream(newFile);
byte[] b = new byte[1024 * 8];
int n = -1;
while ((n = in.read(b)) != -1) {
out.write(b, 0, n);
}
in.close();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
2.配置Action:struts.xml
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- 指定Action对象的实例化交由Spring完成 -->
<constant name="struts.objectFactory" value="spring" />
<!-- 配置Struts2应用的编码集 -->
<constant name="struts.i18n.encoding" value="GBK"/>
<package name="javahero" extends="struts-default">
<interceptors>
<!-- 拦截未登陆的用户 -->
<interceptor name="loginInterceptor" class="web.interceptor.LoginInterceptor" />
<!--自定义栈-->
<interceptor-stack name="default">
<interceptor-ref name="loginInterceptor" />
<interceptor-ref name="defaultStack" />
</interceptor-stack>
</interceptors>
<global-results>
<result name="login" type="redirect">/login.jsp</result>
</global-results>
<!-- 多个文件上传 -->
<action name="upload" class="web.action.UploadAction">
<result name="success">/uploadResult.jsp</result>
<result name="input">/upload.jsp</result>
<param name="savePath">/upload</param>
<!--
动态配置允许上传的文件类型,多个用 "," 分隔
-->
<param name ="allowedTypes">image/bmp,image/png,image/gif,image/jpeg,image/jpg,image/x-png,image/pjpeg</param>
<!-- struts2上传文件拦截器 -->
<interceptor-ref name ="fileUpload" >
<!--
配置允许上传的文件大小,单位字节
-->
<param name = "maximumSize" >2302400</param>
</interceptor-ref >
<interceptor-ref name = "defaultStack" />
</action>
<!-- 文件下载 -->
<action name="download" class="web.action.DownloadAction">
<!-- result类型为“stream”下载 -->
<result name="success" type="stream">
<!-- 下载文件类型定义 -->
<param name="contentType">image/bmp,image/png,image/gif,image/jpeg,image/jpg,image/x-png,image/pjpeg</param>
<!-- 下载文件处理方法 -->
<param name="contentDisposition">attachment;filename="${picFileName}"</param>
<!-- 下载文件输出流定义 -->
<param name="inputName">downloadFile</param>
<param name="bufferSize">4096</param>
</result>
</action>
</package>
</struts>
3.jsp页面:
upload.jsp
<%@ page language="java" contentType="text/html; charset=GBK"
pageEncoding="GBK"%>
<%@taglib uri="/struts-tags" prefix="s"%>
<body>
<center><s:form action="upload.action"
enctype="multipart/form-data" method="post">
选择文件:
<div style="color: red"><s:fielderror /></div>
<s:file name="pic" />
<br>
<s:file name="pic" />
<br>
<s:file name="pic" />
<br>
<s:file name="pic" />
<br>
<s:submit name="submit" value="上传" />
<s:reset name="reset" value="重置" />
</s:form></center>
</body>
download.jsp
<%@ page language="java" contentType="text/html; charset=GBK"
pageEncoding="GBK"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<title>上传结果</title>
</head>
<body>
<center>
上传文件:<br>
<s:iterator id="fileName" value="picFileName" status="fn">
<s:property/>
<a href="download.action?picFileName=<s:property value='#fileName'/>">下载</a>
<br>
</s:iterator>
</center>
</body>
上传页面:
上传结果页面:
下载中文名字文件:
2009-11-26 15:00:10