浅谈Struts2多文件上传思路以及实现

(1)Struts2文件上传首先是视图层,用JSP。
页面文件为:upload.jsp
< %@ page contentType="text/html;charset=gb2312" %>
< A href="mailto:%@taglib">%@taglib< /A> prefix="s" uri="/struts-tags"%>
< HTML xhtml? 1999 www.w3.org http: xmlns="< A href=">http://www.w3.org/1999/xhtml< /A>">
< HEAD>
< ?xml:namespace prefix = s />< s:fielderror>< /s:fielderror>
< FORM encType=multipart/form-data method=post action=upload.action>
文件标题< INPUT name=title>
第一个上传文件:< INPUT type=file name=upload>
第二个上传文件:< INPUT type=file name=upload>
第三个上传文件:< I name="upload" type="file" NPUT>
< INPUT value=上传 type=submit>
< /FORM>

(2)控制器Action
package com.wing.study.upload;

import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.ServletActionContext;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileInputStream;
public class UploadAction extends ActionSupport
{
private String title;
private File[] upload;
private String[] uploadContentType;
private String[] uploadFileName;
private String savePath;
public void setSavePath(String value)
{
this.savePath=value;
}
public String getSavePath()
{
return ServletActionContext.getRequest().getRealPath(savePath);
}
public void setUpload(File[] upload)
{
this.upload=upload;
}
public File[] getUpload()
{
return upload;
}
public void setTitle(String title)
{
this.title=title;
}
public String getTitle()
{
return title;
}
public void setUploadContentType(String[] uploadContentType)
{
this.uploadContentType=uploadContentType;
}
public String[] getUploadContentType()
{
return (this.uploadContentType);
}
public void setUploadFileName(String[] uploadFileName)
{
this.uploadFileName=uploadFileName;
}
public String[] getUploadFileName()
{
return (this.uploadFileName);
}
public String execute() throws Exception
{
for(int i=0;i    { 
FileOutputStream fos = new FileOutputStream(getSavePath() 

+ "\\" + getUploadFileName()[i]);
FileInputStream fis = new FileInputStream(getUpload()[i]);
byte[] buffer = new byte[1024];
int len = 0;
while ((len = fis.read(buffer)) > 0)
{
fos.write(buffer , 0 , len);
}
}
return SUCCESS;
}
}

(3)struts.xml配置文件
这里需要控制文件类型和大小。也就是上传文件过滤。

我在这里不采用手动过滤,因为手动过滤要书写大量过滤代码,开发复杂。

所以这里用上传文件拦截器来控制。
< ?xml version="1.0" encoding="UTF-8"?>

"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"< A href="http://struts.apache.org/dtds/struts-2.0.dtd">

http://struts.apache.org/dtds/struts-2.0.dtd">


< STRUTS>
< CONSTANT value="globalMessages" name="struts.custom.i18n.resources" />
< CONSTANT value="GBK" name="struts.i18n.encoding" />


< PACKAGE name="com" extends="struts-default">


< ACTION class=com.wing.study.upload.UploadAction name="upload">
< INTERCEPTOR-REF name="fileUpload">
< PARAM name="allowedTypes">image/bmp,image/jpeg,image/gif,image/png< /PARAM>
< PARAM name="maximumSize">202400< /PARAM>
< /INTERCEPTOR-REF>
< INTERCEPTOR-REF name="defaultStack" />
< PARAM name="savePath">/upload< /PARAM> 
< RESULT name="input">/upload.jsp< /RESULT>        
< RESULT>/succ.jsp< /RESULT> 
< /ACTION>  
< /PACKAGE>
< /STRUTS>


注意 使用了上传文件拦截器,必须显示的调用默认拦截器栈:defaultStack.

allowedTypes和maximumSize分别过滤文件的类型和大小。

当上传文件不符合定义的要求时,会转向逻辑视图input,然后根据映射转向物理视图upload.jsp

然后根据Struts2标签s:fielderror输出错误信息。当然这里的错误信息你可能不知道是什么。不过可以在国际化资源中将错误信息用中文替代。

当上传文件符合定义的要求时,会转向succ.jsp
上传成功后,会依次显示你上传的图片。通过s:property标签来获取图片地址。
由上面可以看出,通过Struts2来实现文件的上传甚至是多文件上传,并不难。

猜你喜欢

转载自13521308103.iteye.com/blog/1923335