Struts2本身没有提供解析上传文件内容的功能,它使用第三方的文件上传组件提供对文件上传的支持。Struts2默认使用的上传组件是Apache组织的commons-fileupload组件,该组件性能优异,而且支持任意大小文件的上传。Struts2还支持两种文件上传组件:pell和cos,你可以通过配置struts.multipart.parser属性来切换Struts2使用的上传组件。不过还是使用commons-fileupload组件,因为它是最好的。
commons-fileupload组件的下载网址是:http://commons.apache.org/fileupload/
这里还要依赖于Apache的另外一个项目:commons-io,它下载的网址是http://commons.apache.org/io/
struts2提供了一个文件上传拦截器:org.apache.struts2.interceptor.FileUploadInterceptor,它负责调用底层的文件上传组件解析文件内容。并为Action准备上传文件相关属性值。
例如表单中<input type="file" name="file">,Action对应的字段属性就是
java.io.File 类型,已上传文件的File对象。
fileFileName,上传文件的文件名。
fileContentType,上传文件的内容类型。
这三个属性的值会由FileUploadInterceptor拦截器为你准备好。
下面是代码:
upload.jsp
<%@ page language="java" pageEncoding="GBK"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head><title>upload page</title></head>
<body>
<s:actionerror/>
<s:form action="upload" method="post" enctype="multipart/form-data">
<s:file name="file" label="选择上传的文件"/>
<s:textfield name="description" label="文件描述"/>
<s:submit value="上传"/>
</s:form>
</body>
</html>
FileUploadAction.java
package org.struts2.action;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class FileUploadAction extends ActionSupport
{
private static final long serialVersionUID = 1L;
//代表上传文件的file对象
private File file;
//上传文件名
private String fileFileName;
//上传文件的MIME类型
private String fileContentType;
//上传文件的描述信息
private String description;
//保存上传文件的目录,相对于Web应用程序的根路径,在struts.xml文件中配置
private String uploadDir;
public void setUploadDir(String uploadDir)
{
this.uploadDir = uploadDir;
}
public String getDescription()
{
return description;
}
public void setDescription(String description)
{
this.description = description;
}
public File getFile()
{
return file;
}
public void setFile(File file)
{
this.file = file;
}
public String getFileContentType()
{
return fileContentType;
}
public void setFileContentType(String fileContentType)
{
this.fileContentType = fileContentType;
}
public String getFileFileName()
{
return fileFileName;
}
public void setFileFileName(String fileFileName)
{
this.fileFileName = fileFileName;
}
/**
* @see com.opensymphony.xwork.Action#execute()
*/
public String execute() throws Exception
{
String newFileName = null;
//得到当前时间自1970年1月1日0时0分0秒开始流逝的毫秒数,将这个毫秒数作为上传文件新的文件名。
long now = new Date().getTime();
//得到保存上传文件的目录的真实路径
String path = ServletActionContext.getServletContext().getRealPath(uploadDir);
File dir = new File(path);
//如果这个目录不存在,则创建它。
if(!dir.exists())
dir.mkdir();
int index = fileFileName.lastIndexOf('.');
//判断上传文件名是否有扩展名
if (index != -1)
newFileName = now + fileFileName.substring(index);
else
newFileName = Long.toString(now) ;
BufferedOutputStream bos = null;
BufferedInputStream bis = null;
//读取保存在临时目录下的上传文件,写入到新的文件中。
try
{
FileInputStream fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
FileOutputStream fos = new FileOutputStream(new File(dir,newFileName));
bos = new BufferedOutputStream(fos);
byte[] buf = new byte[4096];
int len = -1;
while ((len = bis.read(buf)) != -1)
{
bos.write(buf, 0, len);
}
}
finally
{
try
{
if (null != bis)
bis.close();
}
catch (IOException e)
{
e.printStackTrace();
}
try
{
if (null != bos)
bos.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
return SUCCESS;
}
}
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.i18n.encoding" value="GBK" />
<constant name="struts.custom.i18n.resources"
value="ApplicationResources" />
<constant name="struts.multipart.saveDirg" value="d:\\temp" />
<constant name="struts.multipart.maxSize" value="1024000" />
<package name="default" extends="struts-default">
<action name="upload"
class="org.struts2.action.FileUploadAction">
<interceptor-ref name="defaultStack">
<param name="fileUpload.maximumSize">102400</param>
<param name="fileUpload.allowedTypes">
image/gif,image/jpeg
</param>
</interceptor-ref>
<result name="input">/upload.jsp</result>
<result name="success">/success.jsp</result>
<param name="uploadDir">/WEB-INF/UploadFiles</param>
</action>
</package>
</struts>
ApplicationResources.properties
struts.messages.error.uploading=\u6587\u4ef6\u4e0a\u4f20\u9519\u8bef
struts.messages.error.file.too.large=\u4e0a\u4f20\u7684\u6587\u4ef6\u8d85\u8fc7\u4e86\u9650\u5236\u7684\u957f\u5ea6
struts.messages.error.content.type.not.allowed=\u4e0d\u5141\u8bb8\u4e0a\u4f20\u8fd9\u79cd\u7c7b\u578b\u7684\u6587\u4ef6
success.jsp
<%@ page language="java" pageEncoding="GBK"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
上传成功:<p/>
文件名: <s:property value="fileFileName"/><br/>
文件类型:<s:property value="fileContentType"/><br/>
文件描述:<s:property value="description"/>