欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Struts2文件上传实例

程序员文章站 2022-03-10 19:24:03
struts2没有提供自己的请求解析器,也就是说,struts2不会自己去处理multipart/form-data的请求,它需要调用其他请求解析器,将HTTP请求中的表单域解析出...

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属性:用来封装该文件域应用的文件的文件类型。以上程序调试通过!