java中Struts2 的文件上传和下载示例

文件上传

  1. 表单准备

    • 要想使用 HTML 表单上传一个或多个文件
    • 须把 HTML 表单的 enctype 属性设置为 multipart/form-data
    • 须把 HTML 表单的method 属性设置为 post
    • 需添加 <input type=“file”> 字段.
  2. Struts 对文件上传的支持
    • 在 Struts 应用程序里, FileUpload 拦截器和 Jakarta Commons FileUpload 组件可以完成文件的上传.
    • 步骤:
      1. 在 Jsp 页面的文件上传表单里使用 file 标签. 如果需要一次上传多个文件, 就必须使用多个 file 标签, 但它们的名字必须是相同的
      2. 在 Action 中新添加 3 个和文件上传相关的属性. 这 3 个属性的名字必须是以下格式
        • 基本的文件的上传: 直接在 Action 中定义如下 3 个属性, 并提供对应的 getter 和 setter
        • [File Name] : 类型-File -被上传的文件。例如:data(fileName要求和文件表单项的name一致
        • [File Name]ContentType : 类型-String -上传文件的文件类型。例如:dataContentType(用来接收文件类型(MIME值)
        • [File Name]FileName : String -上传文件的文件名。例如:dataFileName (用来接收文件的名字
      3. 如果上传多个文件, 可以使用 List
        • 若传递多个文件, 则上述的 3 个属性, 可以改为 List 类型! 多个文件域的 name 属性值需要一致.
  3. 示例代码
<s:form action="testUpload" enctype="multipart/form-data">
  <s:textfield name="userName[0]" label="用户-1"></s:textfield>
  <s:file name="photos" label="照片"></s:file>
  <s:textfield name="userName[1]" label="用户-2"></s:textfield>
  <s:file name="photos" label="照片"></s:file>
  <s:textfield name="userName[2]" label="用户-3"></s:textfield>
  <s:file name="photos" label="照片"></s:file>
  <s:submit value="提交"></s:submit>
</s:form> 
public class UploadAction extends ActionSupport{

  @Setter@Getter
  private List<File> photos;
  @Setter@Getter
  private List<String> photosContentType;
  @Setter@Getter
  private List<String> photosFileName;
  @Setter@Getter
  private List<String> userName;

  public String testUpload() throws IOException {
    System.out.println("userName: "+userName);
    System.out.println("photos: "+photos);
    System.out.println("photosFileName: "+ photosFileName);
    System.out.println("photosContentType: "+photosContentType);

    // 将文件传到服务器根目录下upload文件下
    // 获取ServletContext
    ServletContext servletContext = ServletActionContext.getServletContext();
    //获取真实路径
    String realPath = servletContext.getRealPath("/upload");
    System.out.println(realPath);
    File uploadFile = new File(realPath);
    //判断路径是否存在
    if (!uploadFile.exists()){
      //不存在创建
      uploadFile.mkdir();
    }
    for (int i = 0; i < photos.size(); i++) {
      UUID uuid = UUID.randomUUID();
      FileUtils.copyFile(photos.get(i), new File(realPath + "/" + uuid + photosFileName.get(i)));
    }
    return SUCCESS;
  }
}

1.处理几个小问题?

1.文件名重名,一般可以在文件名的前面生成一个UUID作为前缀。

2.限制单个文件的大小

3.限制文件的类型

4.限制总文件的大小

2.在Struts2 中提供了 FileUpload 拦截器 可以给我们设置这些属性值

FileUpload 拦截器有 3 个属性可以设置.

  • maximumSize: 上传单个文件的最大长度(以字节为单位), 默认值为 2 MB
  • allowedTypes: 允许上传文件的类型, 各类型之间以逗号分隔
  • allowedExtensions: 允许上传文件扩展名, 各扩展名之间以逗号分隔
  • 可以在 struts.xml 文件中覆盖这 3 个属性

注意: 在 org.apache.struts2 下的 default.properties 中有对上传的文件总的大小的限制. 可以使用常量的方式来修改该限制struts.multipart.maxSize=2097152

<constant name="struts.devMode" value="true"/>

 <!-- 在这修改总文件的的大小 -->
 <constant name="struts.multipart.maxSize" value="2097152"/>
 <package name="default" namespace="/" extends="struts-default">
  <interceptors>
    <interceptor-stack name="myInterceptor">
      <interceptor-ref name="defaultStack">
        <!-- 修改单个文件大小,Commons FileUpload 组件默认接受上传文件总的最大值为 2M -->
        <param name="fileUpload.maximumSize">57,408</param>
        <!-- 允许上传的文件类型 -->
        <param name="fileUpload.allowedTypes">image/pjpeg,image/gif</param>
        <!-- 允许上传文件的扩展名 -->
        <param name="fileUpload.allowedExtensions">jpg,gif</param>
      </interceptor-ref>
    </interceptor-stack>
  </interceptors>

  <default-interceptor-ref name="myInterceptor"></default-interceptor-ref>

  <action name="testUpload" class="org.pan.action.UploadAction" method="testUpload">
    <result name="success">/WEB-INF/views/success.jsp</result>
    <result name="input">/upload.jsp</result>
  </action>
</package>

一.上传文件相关的错误消息?

1.与文件上传有关的出错消息在 struts-messages.properties 文件里预定义.

2.可以在文件上传 Action 相对应的资源文件 或者 在 i18n_zh_CN.properties 国际化资源文件中重新定义错误消息

struts.messages.error.file.too.large=你传的文件太大了
struts.messages.error.content.type.not.allowed=文件类型错误
struts.messages.error.file.extension.not.allowed=扩展名错误
struts.messages.upload.error.SizeLimitExceededException=文件总大小超过上限

文件下载

  1. 在某些应用程序里, 可能需要动态地把一个文件发送到用户的浏览器中, 而这个文件的名字和存放位置在编程时是无法预知的
  2. Stream 结果类型
    • Struts 专门为文件下载提供了一种 Stream 结果类型. 在使用一个 Stream 结果时, 不必准备一个 JSP 页面.
    • Stream 结果类型可以设置如下参数:
      • contentType:被下载的文件的 MIME 类型。默认值为 text/plain
      • contentLength:被下载的文件的大小,以字节为单位
      • contentDisposition: 可以设置下载文件名的ContentDispositon 响应头,默认值为 inline,通常设置为如下格式:
        • attachment;filename="document.pdf".
      • inputName:Action 中提供的文件的输入流。默认值为 inputStream
      • bufferSize:文件下载时缓冲区的大小。默认值为 1024
      • allowCaching :文件下载时是否允许使用缓存。默认值为 true
      • contentCharSet:文件下载时的字符编码。
        • 以上参数可以在 Action 中以 getter 方法的方式提供!
    • Stream 结果类型的参数可以在 Action 以属性的方式覆盖
    • 具体使用细节参看 struts-2.3.15.3-all/struts-2.3.15.3/docs/WW/docs/stream-result.html
  3. 示例代码
<a href="testDownLoad">下载</a>
public class DownLoadAction extends ActionSupport{
  //通常以下这几个参数会在Action 中提供
  @Setter@Getter
  private String contentType;
  @Setter@Getter
  private long contentLength;
  @Setter@Getter
  private String contentDisposition;
  @Setter@Getter
  private InputStream inputStream;

  public String testDownLoad() throws FileNotFoundException, UnsupportedEncodingException {
    //获取ServletContext
    ServletContext servletContext = ServletActionContext.getServletContext();
    //获取文件的路径
    String realPath = servletContext.getRealPath("/WEB-INF/file/至少还有你.mp3");
    //获取文件的流
    inputStream = new FileInputStream(realPath);
    //设置文件的类型
    contentType = servletContext.getMimeType(realPath);
    //获取文件的长度
    contentLength = new File(realPath).length();
    //设置文件名
    String fileName = "至少还有你.mp3";
    fileName = new String(fileName.getBytes("gbk"),"iso8859-1");
    contentDisposition = "attachment;filename="+fileName;
    return SUCCESS;
  }
}
<!-- 文件下载 -->
<action name="testDownLoad" class="org.pan.action.DownLoadAction" method="testDownLoad">
  <result type="stream">
    <!-- 文件缓冲大小 -->
    <param name="bufferSize">2048</param>
  </result>
</action>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • struts2实现文件上传显示进度条效果

    一. struts2读取进度原理分析(作为草稿存了好久,刚刚发布出来......) 1. 在strut2中控制文件上传信息的类是实现MultiPartRequest接口的JakartaMultiPartRequest 其实第一次看到源文件时我打了个退堂鼓,因为觉得内容太长了,不想看.冷静下来将思路理顺,将分开的各个方法还原到一个方方中中,发现还是很好理解的: @Override public void parse(HttpServletRequest request, String saveDi

  • Struts2实现上传单个文件功能

    upload.jsp 这个页面选择提交文件,提交到uploadImage.action <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http:/

  • 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修改上传文件大小限制方法解析

    首先struts上传最大大小由两个地方决定.  · struts.multipart.maxSize决定整个post的form最大是多大,所以这个限制是最初的.默认大小是接近2M,在struts的default.properties中定义.  · fileuploadInterceptor中可以定义maximumSize最大文件大小. 最初定义在struts.xml中定义了没有生效,后来发现在工程中的struts.properties中已经设置过,所以后来被覆盖了,更改struts.proper

  • java中Struts2 的文件上传和下载示例

    文件上传 表单准备 要想使用 HTML 表单上传一个或多个文件 须把 HTML 表单的 enctype 属性设置为 multipart/form-data 须把 HTML 表单的method 属性设置为 post 需添加 <input type="file"> 字段. Struts 对文件上传的支持 在 Struts 应用程序里, FileUpload 拦截器和 Jakarta Commons FileUpload 组件可以完成文件的上传. 步骤: 在 Jsp 页面的文件上

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

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

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

    先谈一谈struts2实现文件的上传和下载实例实现的原理: Struts 2是通过Commons FileUpload文件上传. Commons FileUpload通过将HTTP的数据保存到临时文件夹,然后Struts使用fileUpload拦截器将文件绑定到Action的实例中.从而我们就能够以本地文件方式的操作浏览器上传的文件. 具体实现: 一.创建index.jsp页面 <body> <s:form action="upload" method="p

  • JAVA使用commos-fileupload实现文件上传与下载实例解析

    首先给大家介绍一文件的上传 实体类 import java.sql.Timestamp; /** * * @Decription 文件上传实体类 * */ public class Upfile { private String id;// ID主键 使用uuid随机生成 private String uuidname; // UUID名称 private String filename;//文件名称 private String savepath; // 保存路径 private Timest

  • JavaScript进阶之前端文件上传和下载示例详解

    目录 文件下载 1.通过a标签点击直接下载 2.open或location.href 3.Blob和Base64 文件上传 文件上传思路 File文件 上传单个文件-客户端 上传文件-服务端 多文件上传-客户端 大文件上传-客户端 大文件上传-服务端 文件下载 1.通过a标签点击直接下载 <a href="https:xxx.xlsx" rel="external nofollow" download="test">下载文件</

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

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

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

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

  • java组件commons-fileupload实现文件上传、下载、在线打开

    最近做了一个文件上传.下载.与在线打开文件的功能,刚开始对文件上传的界面中含有其它表单(例如输入框.密码等)在上传的过程中遇到了许多问题,下面我写了一个同时实现文件上传.下载.在线打开文件的测试程序. 首先请看效果图: 核心代码: package com.jefry; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.net.URL; import java.u

  • Java中的多种文件上传方式总结

    目录 请求类型 单文件上传 多文件上传 多文件单字段上传 多文件多字段上传 请求类型 单文件上传 //上传单个文件 @ResponseBody @RequestMapping(value = "uploadfile", produces = "multipart/form-data;charset=UTF-8") public String uploadfiles(HttpServletRequest request){ CommonsMultipartResolv

  • 详解JavaWeb如何实现文件上传和下载功能

    目录 1. 文件传输原理及介绍 2. JavaWeb文件上传 2.1我们用一个新的方式创建项目 2.2 导包 2.3 实用类介绍 2.4 pom.xml导入需要的依赖 2.5 index.jsp 2.6 info.jsp 2.7 FileServlet 2.8 配置Servlet 2.9 测试结果 3. SpringMVC文件上传和下载 3.1 上传 3.2 下载 1. 文件传输原理及介绍 2. JavaWeb文件上传 2.1我们用一个新的方式创建项目 空项目会直接弹出框 把jdk版本设置好 点

随机推荐