Struts2实现单文件上传,多文件上传与下载(十)上

简介: Struts2实现单文件上传,多文件上传与下载(十)

上传文件和下载文件的重要性就不说了,常用于上传文档,更换头像。


Struts2框架本身提供了一个文件上传的拦截器,在默认的拦截器里面。


一.文件上传前的准备


一.一 添加jar包


Struts2上传时,还需要依赖apache的两个jar包


20200609115235495.png


一.二 注意点


1.Struts2上传文件时,用<s:file name=“upload”> 或者<input type=“file” name=“upload” />均可。 建议使用 s:file 的元素。


2.form表单提交时,提交方式为post提交。(避免文件过大,get方式不支持)


3.form表单提交时,enctype类型需要改变,应该变成:enctype=“multipart/form-data”


4.文件上传对应的Action进行接收文件时, 对象属性 File Xxx需要与<s:file >中的name相同,

如<s:file> name为upload,则Action中File相应的为upload.

<s:file>name为uploadImage,则Action中File为uploadeImage.


5.Action中取得的File upload.getName() 取得的并不是上传文件的真实名称,只是一个缓存的名称,没有任何的意义。


6.Action中想取得上传文件的名称和上传类型,需要定义两个String 类型,格式必须是XxxFileName,XxxContentType。其中Xxx为File的值

XxxFileName 取得文件的名称,XxxContentType 取得文件的类型


二 实现单文件上传


二.一 编写 上传文件表单 /content/single.jsp


<s:form action="File_single.action" namespace="/" method="post" enctype="multipart/form-data">
  用户名: <s:textfield  name="name"/>  <br/>
  密码: <s:password name="password"/><br/>
  上传文件:<s:file name="upload"/><br/>
    <s:submit value="提交"/>
    <s:reset value="重置"/>
</s:form>


需要保证 类型为post 提交,enctype 类型为 multipart/form-data 。


注意,此时 file 元素的名称为upload。


二.二 编写FileAction 进行处理文件接收


FileAction.java


package com.yjl.web.action;
import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.apache.log4j.Logger;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.yjl.pojo.User;
/**
* @author 两个蝴蝶飞
* @version 创建时间:Aug 28, 2018 8:35:56 AM
* 关于文件上传和下载的Action实现
*/
public class FileAction extends ActionSupport implements ModelDriven<User>{
  private static final long serialVersionUID = 1L;
  private Logger logger=Logger.getLogger(FileAction.class);
  //在文件上传时,也同样可以获得其他标签的值.
  private User user=new User();
  @Override
  public User getModel() {
    return user;
  }
  /**
   * 关于文件上传的具体的操作
   * @param uploade 与前端表单中file标签的name值相同.
   * @param XxxFileName 上传文件的名称
   * @param XxxContentType 上传文件的类型
   */
  private File upload;
  private String uploadFileName;
  private String uploadContentType;
  //实现它们三个的setter和getter方法
  public File getUpload() {
    return upload;
  }
  public void setUpload(File upload) {
    this.upload = upload;
  }
  public String getUploadFileName() {
    return uploadFileName;
  }
  public void setUploadFileName(String uploadFileName) {
    this.uploadFileName = uploadFileName;
  }
  public String getUploadContentType() {
    return uploadContentType;
  }
  public void setUploadContentType(String uploadContentType) {
    this.uploadContentType = uploadContentType;
  }
  /**
   *单文件上传操作
   */
  public String single(){
    //在实际开发中,需要判断一下是否上传了文件,即upload是否为空,不为空,才进行上传的操作。
    logger.info("可以取出user的值:"+user.toString());
    if(upload!=null){
      //1.输出上传的类型
      logger.info("上传文件的名称用File取得:"+this.getUpload().getName());
      logger.info("直接用属性取得名称:"+this.getUploadFileName());
      logger.info("文件上传的类型:"+this.getUploadContentType());
      //2.设置上传文件的放置位置,通常放在服务器下面的upload文件夹下.
      String path=ServletActionContext.getServletContext().getRealPath("/upload");
      //3.这是一个目录,如果这个目录不存在,需要创建这个目录(包括其父目录)
      File srcFile=new File(path);
      if(!srcFile.exists()){
        srcFile.mkdirs();
      }
      //4.通常还需要对上传的文件名进行UUID的操作,使文件名不能重复。这里不做处理
      String fileName=this.getUploadFileName();
      //5.调用FileUtils类执行上传的操作.
      try {
        FileUtils.copyFile(upload,new File(srcFile,fileName));
        logger.info("文件上传成功");
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
    return SUCCESS;
  }
}


二.三 配置struts.xml文件


<struts>
  <!--修改国际化编码 -->
  <constant name="struts.i18n.encoding" value="UTF-8"></constant>
  <!--修改是否为开发者模式 -->
  <constant name="struts.devMode" value="true"></constant>
  <!--修改ui样式表 -->
  <constant name="struts.ui.theme" value="simple"></constant>
  <package name="file" extends="struts-default" namespace="/">
    <action name="File_*" class="com.yjl.web.action.FileAction" method="{1}">
        <result name="success">/WEB-INF/content/success.jsp</result>
    </action>
    <!-- 配置跳转页面 -->
    <action name="*">
      <result>/WEB-INF/content/{1}.jsp</result>
    </action>
  </package>
</struts>


二.四 重启服务器,验证文件上传


输入网址: http://localhost:8080/Struts_File/single,


进行上传文件, 老蝴蝶这儿上传一张照片。


20200609115253790.png


查看logger输出


20200609115304742.png


发现file.getName()并没有任何意义。


查看服务器upload文件夹下是否有这张图片:


20200609115315602.png


存在图片,文件上传操作成功。


二. 五 设置上传时,允许的格式和大小


二.五.一 配置格式 和大小


通过文件上传拦截器,进行配置


在上传的时候,一般需要特别指定文件上传时的格式和大小。 Struts2自带的文件上传拦截器已经帮我们实现了这一点,


我们只需要进行简单的配置即可。


在struts.xml配置文件中添加拦截器 fileUpload


<package name="file" extends="struts-default" namespace="/">
  <interceptors>
    <interceptor-stack name="defaultStack">
      <!-- 引入已经定义好的文件上传拦截器,将参数传入进去,名称为fileUpload -->
      <interceptor-ref name="fileUpload">
        <!-- 上传文件的大小 -->
        <param name="maximumSize">500000000</param>
        <!-- 标准MINE名称 -->
                <param name="allowedTypes">text/plain,application/vnd.ms-powerpoint</param>
                <!-- 后缀名  可以传递.txt和.ppt结尾的,此时图片是不行的-->
                <param name="allowedExtensions">.txt,.ppt</param>
      </interceptor-ref>
      <interceptor-ref name="defaultStack"></interceptor-ref>
    </interceptor-stack>
  </interceptors>
  <action name="File_*" class="com.yjl.web.action.FileAction" method="{1}">
      <result name="success">/WEB-INF/content/success.jsp</result>
  </action>
  <!-- 配置跳转页面 -->
  <action name="*">
    <result>/WEB-INF/content/{1}.jsp</result>
  </action>
</package>


二.五.二 验证配置


如果此刻上传图片的话:


20200609115330896.png


会显示异常:


20200609115341794.png


上传.txt文档的话:


20200609115356744.png


是可以正常上传的。


一般设置图片时,常用的格式为:


<interceptors>
  <interceptor-stack name="defaultStack">
    <!-- 引入已经定义好的文件上传拦截器,将参数传入进去,名称为fileUpload -->
    <interceptor-ref name="fileUpload">
      <!-- 上传文件的大小 -->
      <param name="maximumSize">500000000</param>
            <!-- 后缀名  设置常见的图片形式-->
            <param name="allowedExtensions">.bmp,.jpg,.png,.gif</param>
    </interceptor-ref>
    <interceptor-ref name="defaultStack"></interceptor-ref>
  </interceptor-stack>
</interceptors>


二.五.三 设置 struts.multipart.maxSize 常量,控制文件大小


有的时候,可能会上传视频或者其他大文件,可以在struts.xml常量中配置相应的上传文件大小。


默认的大小是2M,即使你在设置类型时,用了maximumSize,设置了一个很大的值。


那么当大小超过2M时,也是错误的。


这个时候需要设置另外一个参数。常量:struts.multipart.maxSize


<constant name="struts.multipart.maxSize" value="1000000000"/> 
相关文章
SpringMVC文件上传、文件下载多文件上传及jrebel的使用与配置2
SpringMVC文件上传、文件下载多文件上传及jrebel的使用与配置2
57 0
|
前端开发 文件存储 数据库
SpringMVC文件上传、文件下载多文件上传及jrebel的使用与配置1
SpringMVC文件上传、文件下载多文件上传及jrebel的使用与配置1
80 0
|
前端开发
SpringMVC文件上传、文件下载多文件上传及jrebel的使用与配置3
SpringMVC文件上传、文件下载多文件上传及jrebel的使用与配置3
70 0
|
7月前
SpringMVC之文件上传和下载
【1月更文挑战第20天】SpringMVC之文件上传和下载
48 1
|
7月前
|
Java
Struts文件上传与下载详解_上传单个文件
Struts文件上传与下载详解_上传单个文件
|
7月前
|
Java
Struts文件上传与下载详解 _上传多个文件
Struts文件上传与下载详解 _上传多个文件
|
7月前
|
存储 前端开发 Java
SpringMVC 文件上传和下载
SpringMVC 文件上传和下载
45 0
|
前端开发 Java Maven
【SpringMVC 从 0 开始】文件上传和下载
【SpringMVC 从 0 开始】文件上传和下载
【SpringMVC 从 0 开始】文件上传和下载
|
前端开发 Java Maven
SpringMVC文件上传与下载
SpringMVC文件上传与下载
springmvc文件上传和下载
springmvc文件上传和下载 使用ResponseEntity实现下载文件的功能 二:文件上传 2.1添加依赖: 2.2在SpringMVC的配置文件中添加配置: 2.3控制器方法:
207 0
springmvc文件上传和下载