Struts2学习手册之文件上传基础教程

前言

我们在开发Web应用时,肯定要为用户提供上传的功能,比如用户上传一张图像作为头像等。为了能上传文件,我们必须将表单的method设置为POST,将enctype设置为multipart/form-data。只有在这种情况下,浏览器才会把用户选择文件的二进制数据发送给服务器。这篇文章就对Struts2框架中的上传功能进行详细的总结,下面话不多说了,来一起看看详细的介绍吧。

Struts2的文件上传

Struts2并未提供自己的请求解析器,也就是说,Struts2不会自己去处理multipart/form-data的请求,它需要调用其它上传框架来解析二进制请求数据,但Struts2在原有的上传解析器基础上做了进一步封装,更进一步简化了文件上传。

在Struts2的default.properties配置文件中,可以看到这样的配置代码:

### Parser to handle HTTP POST requests, encoded using the MIME-type multipart/form-data
# struts.multipart.parser=cos
# struts.multipart.parser=pell
# struts.multipart.parser=jakarta-stream
struts.multipart.parser=jakarta
# uses javax.servlet.context.tempdir by default
struts.multipart.saveDir=
struts.multipart.maxSize=2097152

上述代码主要用于配置Struts2上传文件时的上传解析器。Struts2的封装隔离了底层文件上传组件的区别,开发者只要在此配置文件上传所使用的解析器,就可以轻松地在不同的文件上传框架之间切换。

Struts2默认使用jakarta上传解析器,当然了,如果你不喜欢,你也可以换成别的。下面就通过代码来实现一个简单的基于Struts2的文件上传功能。

实现文件上传的Action

前台页面:

<form action="upload" method="post" enctype="multipart/form-data">
 Title:<input type="text" name="title"><br>
 File:<input type="file" name="upload"><br>
 <input type="submit" value="submit">
</form>

Action类:

public class UploadAction extends ActionSupport
{
 private String title;
 private File upload;
 private String uploadContentType;
 private String uploadFileName;
 private String savePath;

 public void setSavePath(String value)
 {
  this.savePath = value;
 }

 private String getSavePath()
 {
  String realPath = ServletActionContext.getServletContext().getRealPath("/WEB-INF/" + savePath);
  return realPath;
 }

 public void setTitle(String value)
 {
  this.title = value;
 }

 public String getTitle()
 {
  return title;
 }

 public void setUpload(File value)
 {
  this.upload = value;
 }

 public File getUpload()
 {
  return upload;
 }

 public void setUploadContentType(String value)
 {
  this.uploadContentType = value;
 }

 public String getFileContentType()
 {
  return uploadContentType;
 }

 public void setUploadFileName(String value)
 {
  this.uploadFileName = value;
 }

 public String getUploadFileName()
 {
  return uploadFileName;
 }

 @Override
 public String execute() throws Exception
 {
  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);
  }
  fis.close();
  fos.close();
  return SUCCESS;
 }
}

struts.xml配置文件:

<package name="upload" extends="struts-default">
 <action name="upload" class="com.jellythink.practise.UploadAction">
  <param name="savePath">/upload</param>
  <result name="success">/success.jsp</result>
  <result name="input">/index.jsp</result>
 </action>
</package>

对于Action类中,包含了两个特别的属性:

  • uploadContentType
  • uploadFileName

这两个属性分别用于封装上传文件的文件名、上传文件的文件类型。对于Struts2来说,如果Form表单中包含一个name属性为xxx的文件域,则对应的Action需要使用三个属性来封装该文件域的信息:

  • 类型为File的xxx属性封装了该文件域对应的文件内容;
  • 类型为String的xxxFileName属性封装了该文件域对应的文件的文件名;
  • 类型为String的xxxContentType属性封装了该文件域对应的文件的文件类型。

通过上面的开发过程,可以看出通过Struts2实现文件上传确实是一件简单的事情。我们需要做的事情就是将文件域与Action中一个类型为File的属性关联,就可以轻松访问到上传文件的文件内容,至于Struts2如何使用Multipart解析器,对开发者完全透明。

手动实现文件过滤

很多时候,Web应用不允许用户自由上传,我们需要对用户上传的文件类型,文件大小进行限制,因此必须在文件上传过程中进行文件过滤。下面就先手动实现上传文件过滤。

在struts.xml中配置一个新的参数,表示支持的上传类型:

<param name="allowTypes">image/png,image/gif,image/jpeg</param>

在Action中添加验证函数:

// 进行验证
@Override
public void validate()
{
 String filterResult = filterType(getAllowTypes().split(","));
 if (filterResult != null)
 {
  addFieldError("upload", "您要上传的文件类型不正确!");
 }
}

public String filterType(String[] types)
{
 String fileType = getFileContentType();
 for (String type : types)
 {
  if (type.equals(fileType))
  {
   return null;
  }
 }
 return ERROR;
}

这只是实现了类型的判断,然后在根据File类的length()方法,来实现大小的验证。但是好麻烦,接下来就说一种更简单的说法。

拦截器实现文件过滤

Struts2提供了一个文件上传的拦截器,通过配置拦截器可以更轻松地实现文件过滤。Struts2中文件上传的拦截器fileUpload,为了让该拦截器起作用,只需要在该Action中配置该拦截器引用即可。

配置fileUpload拦截器时,可以为其指定两个参数:

  • allowedTypes:该参数指定允许上传的文件类型,多个文件类型之间以英文逗号隔开
  • maximumSize:该参数指定允许上传的文件大小,单位是字节
<!-- 配置fileUpload拦截器 -->
<interceptor-ref name="fileUpload">
 <param name="allowedTypes">image/png,image/gif,image/jpeg</param>
 <param name="maximumSize">20000000</param>
</interceptor-ref>

<!-- 配置系统默认的拦截器 -->
<interceptor-ref name="defaultStack" />
<result name="success">/success.jsp</result>
<result name="input">/index.jsp</result>

这样子,修改配置就可以搞定的事情,比写一坨代码真的轻松多了。

配置错误信息

对于上传出现错误的情况,系统默认都是提示英文的错误信息,但是为了输出国际化的提示信息,这就需要在国际化的资源配置文件中增加以下两个key的消息定义:

  • struts.messages.error.content.type.not.allowed=上传文件类型不正确,请重新上传
  • struts.messages.error.file.too.large=您上传的文件太大,请重新上传

接下来就可以使用<s:fielderror/>来输出错误信息了。

文件上传的常量配置

在文章的开始,我们说到default.properties中的配置,其中有一个struts.multipart.saveDir配置,那么该配置项的具体作用是什么呢?

在Struts2执行文件上传的过程中,需要指定一个临时文件夹,用来存放上传过程中产生的临时文件;如果没有指定临时文件夹,系统默认使用javax.servlet.context.tempdir,在Tomcat安装路径下的work/Catalina/localhost/路径下。而这个struts.multipart.saveDir就是配置临时文件的存放位置的。所以在开发的过程中,一定要注意该目录是否有读写权限哦。

还有一个struts.multipart.maxSize配置,该配置表示上传文件的大小,如果同时指定了这个配置和fileUpload拦截器的maximumSize属性,则先和struts.multipart.maxSize配置的比较,再和fileUpload拦截器的maximumSize属性比较,如果文件大小超过了struts.multipart.maxSize配置的,则会出现异常,并不会将Result转到input,这个一定要注意。

总结

这篇文章详细的总结了Struts2中的文件上传,内容有点多,基本都是手册上的内容,也罢,就当手册了。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

您可能感兴趣的文章:

  • java中struts2实现文件上传下载功能实例解析
  • struts2单个文件上传的两种实现方式
  • 关于Struts2文件上传与自定义拦截器
  • Struts2+jquery.form.js实现图片与文件上传的方法
  • JavaWeb中struts2实现文件上传下载功能实例解析
  • JavaEE中struts2实现文件上传下载功能实例解析
  • java中struts2实现简单的文件上传与下载
  • struts2+jsp实现文件上传的方法
  • struts2实现多文件上传的示例代码
  • java中Struts2文件上传问题详解
(0)

相关推荐

  • java中Struts2文件上传问题详解

    首先是网页部分,upload_file.jsp <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML> <html> <head> <title>Upload File</title> </head> <body> <form act

  • JavaEE中struts2实现文件上传下载功能实例解析

    本文实例为大家分享了struts2实现文件上传下载的具体实现代码,供大家参考,具体内容如下 一.文件上传 struts提交的文件组件上传, 前台: 1).提交方式POST 2).表单类型 multipart/form-data 3).input type=file 后台: Apache提供的FileUpload组件 核心类: FileItemFactory FileItem的工厂 ServletFileUpload servlet 中的文件上传的核心类 FileItem 封装了上传的表单文件项的

  • Struts2+jquery.form.js实现图片与文件上传的方法

    本文实例讲述了Struts2+jquery.form.js实现图片与文件上传的方法.分享给大家供大家参考,具体如下: jquery.form.js是jQuery的一个官方用语支持异步上传文件的插件.官方网站:http://plugins.jquery.com/form/ 结合Struts2三步轻松实现文件上传 一般是针对一个页面可能不止一个Form表单,所以在一个面提交表单会影响到另一个表单,为此,图片上传表单就可以使用无刷新提交方式上传,也就是异步上传,这时jquery.from.js就派上用

  • 关于Struts2文件上传与自定义拦截器

    一.访问或添加request/session/application属性 public String scope() throws Exception{   ActionContext ctx = ActionContext.getContext();   ctx.getApplication().put("app", "应用范围");//往ServletContext里放入app   ctx.getSession().put("ses", &q

  • struts2实现多文件上传的示例代码

    开发环境JDK1.8 eclipse struts2-2.3.31 1.创建web项目 2.导入struts2核心jar包 3.更改web.xml配置文件(只要配置好struts2的Filter就好) 4.创建src/struts.xml文件 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD

  • struts2+jsp实现文件上传的方法

    本文实例讲述了struts2+jsp实现文件上传的方法.分享给大家供大家参考.具体如下: 1. java代码: package com.wang.test; import java.io.InputStream; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ActionSupport; public cla

  • java中struts2实现文件上传下载功能实例解析

    本文实例讲述了java中struts2实现文件上传下载功能实现方法.分享给大家供大家参考.具体分析如下: 1.文件上传 首先是jsp页面的代码 在jsp页面中定义一个上传标签 复制代码 代码如下: <tr>      <td align="right" bgcolor="#F5F8F9"><b>附件:</b></td>      <td bgcolor="#FFFFFF">

  • java中struts2实现简单的文件上传与下载

    一.Struts2文件上传  Struts2的文件上传实现非常简单,只需要简单几步就可完成: 注意: (1)文件上传的struts2标签为:<s:file name="" label="上传"/> (2)文件上传的前提是表单属性method="post" enctype="multipart/form-data"; (3)web应用中必须包含common-fileupload.jar和common-io.jar,因

  • JavaWeb中struts2实现文件上传下载功能实例解析

    在做B/S系统时,通常会涉及到上传文件和下载文件,在没接struts2框架之前,我们都是使用apache下面的commons子项目的FileUpload组件来进行文件的上传,但是那样做的话,代码看起来比较繁琐,而且不灵活,在学习了struts2后,struts2为文件上传下载提供了更好的实现机制,在这里我分别就单文件上传和多文件上传的源代码进行一下讲解,这里需要导入文件下载上传的两个jar文件,一个是commons-fileupload-1.2.2.jar,另一个是commons-io-2.0.

  • struts2单个文件上传的两种实现方式

    通过2种方式模拟单个文件上传,效果如下所示 开发步骤如下: 1.新建一个web工程,导入struts2上传文件所需jar,如下图 目录结构 2.新建Action 第一种方式 复制代码 代码如下: package com.ljq.action; import java.io.File; import org.apache.commons.io.FileUtils;import org.apache.struts2.ServletActionContext; import com.opensymph

随机推荐