为了上传文件必须将表单的method设置为POST,将 enctype 设置为 muiltipart/form-data,只有设置为这种情况下,浏览器才会把用户选择文件的二进制数据发送给服务器。

  1. 上传解析器配置
    1. Struts2 没有提供自己的请求解析器,struts2 需要调用其他上传框架来解析二进制数据,struts2 默认使用 jakarta 的 Common-FileUpload 的文件上传框架,需要在 Web 应用的 lib 中增加 commons-io-2.2.jar 和 commons-fileupload-1.3.2.jar。
    2. 通过 struts2 的
      常量配置 struts.multipart.parser 来设置文件上传解析器,默认值 jakarta
    3. Struts.multipart.saveDir:上传文件的临时文件保存路径,默认值 javax.servlet.context.tempdir 配置的路径,该路径是Tomcat的安装路径下的 work\Catalina\localhost
    4. Struts.multipart.maxSize:整个表单请求内容的最大字节数,默认值 2097152
  2. 上传Action 解析
    1. 创建 java.io.File 类型的字段来接收上传的文件流;创建 xxxFileName 和 xxxContentType 来读取原始上传的文件名称和文件类型,其中 xxx 表示的是 java.io.File 类型的字段名称,比如示例是名为 upload 字段接收上传的文件流,因此需要有 uploadFileName 和 uploadContentType 来接收该文件流的原始文件名称和文件类型,示例代码如下:

       
       

      public class UploadAction extends ActionSupport {

       
       

      /**

      *

      */

      private static final long serialVersionUID = 283051583917637792L;

       
       

      private File upload;

      private String uploadFileName;

      private String uploadContentType;

      private String uploadPath;

       
       

      public UploadAction() {

      uploadPath = "upload";

      }

       
       

      @Override

      public String execute() throws Exception {

       
       

      if (upload == null) {

      addActionError("没有选择上传文件");

      return INPUT;

      }

       
       

      String filePath = ServletActionContext.getServletContext().getRealPath(uploadPath);

       
       

      java.io.File dir = new java.io.File(filePath);

      if (dir.exists() == false) {

      if (dir.mkdirs() == false) {

      addActionError("创建目录失败,目录路径=" + filePath);

      return INPUT;

      }

      }

       
       

      System.out.println("Upload FileName =" + uploadFileName);

      System.out.println("Upload ContentType =" + uploadContentType);

       
       

      FileOutputStream fileOutputStream = new FileOutputStream(filePath + File.pathSeparator + uploadFileName);

      FileInputStream fileInputStream = new FileInputStream(upload);

      byte[] buffer = new byte[4096];

      int len = 0;

      do {

      len = fileInputStream.read(buffer, 0, buffer.length);

      if (len > 0) {

      fileOutputStream.write(buffer, 0, len);

      }

      } while (len > 0);

       
       

      addActionMessage("上传完成,保存路径=" + filePath + File.pathSeparator + uploadFileName);

       
       

      return SUCCESS;

      }

       
       

      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;

      }

      }

  3. fileUpload 拦截器
    1. fileUpload 拦截器是struts2 提供的一个文件上传拦截器,用于拦截不允许的上传文件类型和文件大小,需要配置二个参数来处理:
      1. 参数 allowedTypes:该参数指定允许上传的文件类型(contentType),多个文件类型以英文逗号隔开
      2. 参数 maximumSize:该参数指定允许上传的文件大小,单位字节
    2. 如果上传文件类型或者文件大小错误,fileUpload 拦截器将会读取全局国际化资源文件来进行提示,读取的Key如下:
      1. struts.messages.error.file.too.large:该key表示上传的文件太大的提示
        1. {0} 表示 ActionName
        2. {1} 表示上传原始文件名称
        3. {2} 表示服务器临时文件名称
        4. {3} 上传文件的 ContentType
      2. struts.messages.error.content.type.not.allowed:该key表示上传文件类型错误的提示
        1. {0} 表示 ActionName
        2. {1} 表示上传原始文件名称
        3. {2} 表示服务器临时文件名称
        4. {3} 上传文件的字节大小
        5. {4} 允许的上传文件字节大小
      3. struts.messages.error.uploading:该key表示上传文件出现一个未知错误的提示
    3. 配置示例代码

      <action name="upload" class="org.drsoft.actions.file.UploadAction">

      <interceptor-ref name="fileUpload">

      <param name="allowedTypes">image/png</param>

      <param name="maximumSize">102400</param>

      </interceptor-ref>

      <!--必须增加该项,如果不增加其他的拦截器会默认增加该拦截器-->

      <interceptor-ref name="defaultStack"/>

     
     

    <result name="success">/WEB-INF/content/file/upload.jsp</result>

    <result name="input">/WEB-INF/content/file/upload.jsp</result>

    </action>

  4. 下载文件 Action
    1. 下载文件的Action需要使用 stream 的结果类型,stream结果类型需要指定一个 inputName 参数,该参数指定了一个输入流,这个输入流是被下载文件的入口,详细参数如下:
      1. 参数 inputName:表示其Action类的返回 InputStream 的下载方法名称,示例,设置为 downloadFile 则会调用 Action类的 getDownloadFile 方法
      2. 参数 contentType:设置 httpResponse 的 mime-type ,设置 response 的 contentType 头,默认值 text/plain,通用值 application/octet-stream
      3. 参数 contentDisposition:设置响应报文头的 content disposition 值,用于指定浏览器的处理方式和下载文件名称,默认类型为 inline(内联),浏览器将会打开文件,可以设置 attachment(附件),浏览器将提示保存文件,参数示例:Inline;filename="downloadfile.zip",如果文件名称为中文,则需要使用 java.net.URLEncoder.encode(fileName, "UTF-8")
      4. 参数 contentLength:设置流的字节长度,用于浏览器的下载进度显示
      5. 参数 bufferSize:输入流和输出流的缓冲区字节大小
      6. 参数 allowCaching:如果设置为 false,会将 response 报文头的 Cache-Control设置为no-cache,默认值 true
      7. 参数 contentCharSet:设置内容编码,如果设置了值将会增加到x响应报文的 contentType 后面附加 ";charset=value"

         
         

     
     

 
 

笔记:Struts2 文件上传和下载的更多相关文章

  1. Struts2文件上传和下载(原理)

    转自:http://zhou568xiao.iteye.com/blog/220732 1.    文件上传的原理:表单元素的enctype属性指定的是表单数据的编码方式,该属性有3个值:1)     ...

  2. 十六、Struts2文件上传与下载

    文件上传与下载 1.文件上传前提:<form action="${pageContext.request.contextPath}/*" method="post& ...

  3. 【SSH2(实用文章)】--Struts2文件上传和下载的例子

    回想一下,再上一篇文章Struts2实现机制,该步骤做一步一步来解决,这种决心不仅要理清再次Struts2用法.映射机制及其在深入分析.最后一个例子来介绍Struts2一种用法,这里将做一个有关文件上 ...

  4. 学习Struts--Chap07:Struts2文件上传和下载

    1.struts2文件上传 1.1.struts2文件上传的基本概述 在开发web应用的时候,我们一般会为用户提供文件上传的功能,比如用户上传一张图像作为头像等.为了能上传文件,我们必须将表单的met ...

  5. struts2 文件上传和下载,以及部分源代码解析

    struts2 文件上传 和部分源代码解析,以及一般上传原理 (1) 单文件上传 一.简单介绍 Struts2并未提供自己的请求解析器,也就是就Struts2不会自己去处理multipart/form ...

  6. (八)Struts2 文件上传和下载

    所有的学习我们必须先搭建好Struts2的环境(1.导入对应的jar包,2.web.xml,3.struts.xml) 第一节:Struts2 文件上传 Struts2 文件上传基于Struts2 拦 ...

  7. Java精选笔记_文件上传与下载

    文件上传与下载 如何实现文件上传 在Web应用中,由于大多数文件的上传都是通过表单的形式提交给服务器的,因此,要想在程序中实现文件上传的功能,首先得创建一个用于提交上传文件的表单页面. 为了使Serv ...

  8. struts2学习(13)struts2文件上传和下载(1)

    一.Struts2文件上传: 二.配置文件的大小以及允许上传的文件类型: 三.大文件上传: 如果不配置上传文件的大小,struts2默认允许上传文件最大为2M: 2097152Byte:   例子实现 ...

  9. Struts2文件上传与下载

    一,页面 index.html 在页面中最重要的就是这个文件上传用的 form 表单,注意这里一定要把 form 的encyType属性明确标定为“multipart/form-data”,只有这样. ...

随机推荐

  1. HttpURLConnection 411错误解决

    1.问题描述 Java HttpURLConnection类发送Http请求链接外网返回ResponseCode为411,对方为.NET服务器,网上查明原因可能来自以下: 1.可能是没有传http中的 ...

  2. C语言视频简介

    通过学习<C语言基础视频教程>,可以让你对C语言有一个基础的了解,并且会编写一些基础的程序,本次视频主要讲解的内容有: 1. 数字的进制转换 2. 变量.运算符和表达式 3. 流程控制语句 ...

  3. Token认证来龙去脉

    在Web领域基于Token的身份验证随处可见.在大多数使用Web API的互联网公司中,tokens 是多用户下处理认证的最佳方式. 为什么要用 Token Token 完全由应用管理,所以它可以避开 ...

  4. RHEL64 缺少ISO 9660图像 安装程序试图挂载映像#1,在硬盘上无法找到该映像

    用光盘安装Linux,很容易,按照提示一步一步就好.如果没有光驱,只好想办法用硬盘或者U盘安装了. 首先说说怎样用U盘启动Linux的安装程序:1.将ISO镜像文件拷贝到U盘中,并解压到U盘根目录.将 ...

  5. TortoiseSVN设置忽略文件和目录文件夹

    TortoiseSVN设置忽略文件和目录文件夹  在多数项目中你总会有文件和目录不需要进行版本控制.这可能包括一些由编译器生成的文件,*.obj,*.lst,或许是一个用于存放可执行程序的输出文件夹. ...

  6. android界面设计之布局管理

    谈到android界面设计,各种布局样式不得不提!传统的布局方式有6种,我们会一一介绍. 在android studio2.2版本之后出现了一款超棒的布局方式,真正意义上的所见即所得,后面我们也会讲到 ...

  7. select选中获取索引三种写法

    $('#someId').prop('selectedIndex'); $('option:selected', '#someId').index(); $('#someId option').ind ...

  8. 手机端仿ios的单级联动脚本三

    脚本 <script>var weekdayArr=['非公司企业法人','个体工商户','私营独资企业','私营合伙企业','有限责任公司','股份有限责任公司'];var mobile ...

  9. 学习一之UML类图

    前言 最近在学习程杰老师的<大话设计模式>,觉得非常不错,就做了一些学习笔记和总结.如果对设计模式很感兴趣的,可以直接阅读书籍,相信会有更多的收获. 本人小菜一枚,如果理解的不对的还请多多 ...

  10. JavaScript设计模式(4)-桥接模式

    桥接模式 在设计一个 Js API 时,可用来弱化它与使用它的类和对象之间的耦合 1. 事件监听器的回调函数 function getBeerById(id, callback) { asyncReq ...