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"/>