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"/> 
相关文章
|
安全 Java
【Java面试】ConcurrentHashMap的key为什么不允许为null?
【Java面试】ConcurrentHashMap的key为什么不允许为null?
805 0
UMI多环境配置
一般来说项目不止有dev和prod两个环境,umi可以通过环境变量 UMI_ENV 区分不同环境来指定配置。
1716 0
|
人工智能 自动驾驶 安全
《解锁数据新动能:数据标注工具与AI模型训练平台的无缝对接热潮》
在人工智能快速发展的今天,数据成为核心驱动力。数据标注工具与模型训练平台的集成,实现了数据无缝流转,犹如为AI发展装上双引擎。集成不仅提高了数据传输效率、减少了人工干预,还确保了数据准确性,提升了模型性能。统一的数据标准、高效的接口设计和严格的安全保障是实现无缝流转的关键要素。这种集成推动了医疗、自动驾驶等领域的快速发展,促进了数据驱动的创新,为企业和社会带来巨大价值。未来,这一趋势将更加高效智能,进一步推动AI技术的广泛应用。
495 8
|
机器学习/深度学习 算法 安全
大模型进阶微调篇(二):基于人类反馈的强化学习RLHF原理、优点介绍,但需要警惕LLMs的拍马屁行为
本文探讨了基于人类反馈的强化学习(RLHF)方法的优缺点。作者指出,虽然RLHF能够使模型更好地满足用户需求,但也存在缺乏多样性、创新不足、偏好固化和难以适应动态变化等问题。文章通过具体实验和示例代码,详细解析了RLHF的工作原理,并强调了其在实际应用中的潜在风险。
1549 6
|
开发者 Java UED
大文件传输不再头疼:揭秘Struts 2如何轻松应对文件上传与下载难题!
【8月更文挑战第31天】在Web应用开发中,文件上传与下载至关重要。Struts 2作为主流Java EE框架,凭借Commons FileUpload及文件上传拦截器简化了相关操作。本文探讨Struts 2在文件传输上的优势,通过具体配置与代码示例,展示如何设置最大文件大小、使用`fileUpload`拦截器以及实现文件上传与下载功能。对于大文件传输,Struts 2不仅能够轻松应对,还支持上传进度显示,有效提升了用户体验。总体而言,Struts 2为文件传输提供了高效便捷的解决方案,助力开发者构建稳定可靠的Web应用。然而,在处理大文件时需兼顾网络带宽与服务器性能,确保传输顺畅。
294 1
|
机器人 数据中心
几个AC/DC电源模块的工业应用场景案例
几个AC/DC电源模块的工业应用场景案例
几个AC/DC电源模块的工业应用场景案例
|
存储 Linux Shell
Linux基本命令之修改主机名、用户名、密码
Linux基本命令之修改主机名、用户名、密码
|
Java 关系型数据库 MySQL
Springboot的房屋租赁租房系统
Springboot的房屋租赁租房系统
|
搜索推荐 算法 大数据
【数据结构入门精讲 | 第十篇】考研408排序算法专项练习(二)
【数据结构入门精讲 | 第十篇】考研408排序算法专项练习(二)
369 0