用户登录
用户注册

分享至

Struts2文件上传实例

  • 作者: Once丶owned
  • 来源: 51数据库
  • 2021-07-30

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="http://www.51sjk.com/Upload/Articles/1/0/253/253671_20210627003202584.jpg 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属性:用来封装该文件域应用的文件的文件类型。以上程序调试通过!

软件
前端设计
程序设计
Java相关