Struts2文件上传实例
struts2没有提供自己的请求解析器,也就是说,struts2不会自己去处理multipart/form-data的请求,它需要调用其他请求解析器,将HTTP请求中的表单域解析出来,但struts2在原有的上传解析器上作了进一步封装,更进一步简化了文件上传,Struts2的struts.properties配置文件中,配置struts2的上传文件解析器struts.multipart.parser=jakarta(srtuts2默认),也可以设置为常用的cos,pell等。项目结构示意图:web.xml文件内容:<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="https://java.sun.com/xml/ns/javaee"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://java.sun.com/xml/ns/javaee
https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<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>
<filter>
<filter-name>struts-cleanup</filter-name>
<filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>
</filter>
<filter-mapping>
<filter-name>struts-cleanup</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
这里web.xml多配置了一个ActionContextCleanUp的配置,这个类是一个filter,他的作用是方便strut2与sitemesh整合,与文件上传本没有关系,但不加载这个filter,可能在上传中出现莫名的异常,加入后就稳定了,可能是strut2的bug吧。index.jsp文件内容:<%@page language="java" pageEncoding="GBK"%><%@taglib prefix="s" uri="/struts-tags"%><%@taglib prefix="c" uri="https://java.sun.com/jstl/core_rt"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> </head> <body> ${requestScope.typeError} <form action="upload.action" method="post" enctype="multipart/form-data"> <input type="text" name="title" /> <br> <input type="file" name="upload" /> <br> <input value="upload" type="submit" /> </form> </body></html>success.jsp文件内容:<%@ page language="java" pageEncoding="GBK"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
</head> <body> 上传成功! <br> 文件标题: <s:property value=" + title" /> <br> 文件为: <img src="<s:property value="'upload/' + uploadFileName"/>" /> <br> </body></html>struts.properties文件内容:struts.locale=zh_CNstruts.i18n.encoding=GBKstruts.multipart.parser=jakartastruts.xml文件内容:<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "https://struts.apache.org/dtds/struts-2.0.dtd"><struts> <include file="struts-default.xml" /> <constant name="struts.multipart.maxSize" value="20971520" /> <constant name="struts.custom.i18n.resources" value="globalMessages" /> <constant name="struts.i18n.encoding" value="GBK" /> <package name="lee" extends="struts-default"> <action name="upload" class="lee.UploadAction"> <param name="allowTypes"> image/pjpeg,image/bmp,image/jpg,image/png,image/gif,image/jpeg </param> <param name="savePath">/upload</param> <result>/success.jsp</result> <result name="input">/index.jsp</result> </action> </package></struts>参看tomcat的web.xml中的mime:<mime-mapping> <extension>gif</extension> <mime-type>image/gif</mime-type></mime-mapping>UploadAction.java文件内容:package lee;import java.io.*;import com.opensymphony.xwork2.ActionContext;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionSupport;public class UploadAction extends ActionSupport { private String title; private File upload; private String uploadContentType; private String uploadFileName; private String allowTypes; // 接受依赖注入的属性 private String savePath; // 接受依赖注入的方法 public void setSavePath(String value) { this.savePath = value; } private String getSavePath() throws Exception { return ServletActionContext.getServletContext().getRealPath(savePath); } public void setTitle(String title) { this.title = title; } public void setUpload(File upload) { this.upload = upload; } public void setUploadContentType(String uploadContentType) { this.uploadContentType = uploadContentType; } public void setUploadFileName(String uploadFileName) { this.uploadFileName = uploadFileName; } public String getTitle() { return (this.title); } public File getUpload() { return (this.upload); } public String getUploadContentType() { return (this.uploadContentType); } public String getUploadFileName() { return (this.uploadFileName); } @Override public String execute() throws Exception { System.out.println("开始上传单个文件---"); System.out.println(getSavePath()); System.out.println("==========" + getUploadFileName()); System.out.println("==========" + getUploadContentType()); System.out.println("==========" + getUpload()); // 判断是否允许上传 String filterResult = filterType(this.getAllowTypes().split(",")); if (filterResult != null) { ActionContext.getContext().put("typeError","您要上传的文件类型不正确"); return filterResult; } // 以服务器的文件保存地址和原文件名建立上传文件输出流 FileOutputStream fos = new FileOutputStream(getSavePath() + "\\" + getUploadFileName()); FileInputStream fis = new FileInputStream(getUpload()); byte[] buffer = new byte[1024]; int len = 0; while ((len = fis.read(buffer)) > 0) { fos.write(buffer, 0, len); } return SUCCESS; } public String filterType(String[] types) { String fileType = this.getUploadContentType(); for (String type : types) { if (type.equals(fileType)) { return null; } } return INPUT; } public String getAllowTypes() { return allowTypes; } public void setAllowTypes(String allowTypes) { this.allowTypes = allowTypes; }}Struts2针对表单中名为xxx的文件域,在对应的Action类中使用3个属性来封装该文件域信息:
1.类型为File的xxx属性:用来封装页面文件域对应的文件内容。
2.类型为String的xxxFileName属性:用来封装该文件域对应的文件的文件名。
3.类型为String的xxxContentType属性:用来封装该文件域应用的文件的文件类型。以上程序调试通过!
下一篇: MongoDB版本及存储引擎区别