笔记:Struts2 文件上传和下载

为了上传文件必须将表单的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"

        ?
        ?

    ?
    ?

?
?

时间: 2024-10-25 18:51:54

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

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

一.Struts2文件上传: 二.配置文件的大小以及允许上传的文件类型: 三.大文件上传: 如果不配置上传文件的大小,struts2默认允许上传文件最大为2M: 2097152Byte: 例子实现: com.cy.action.FileUploadAction.java: package com.cy.action; import java.io.File; import org.apache.commons.io.FileUtils; import com.opensymphony.xwork

Struts2文件上传与下载

一,页面 index.html 在页面中最重要的就是这个文件上传用的 form 表单,注意这里一定要把 form 的encyType属性明确标定为“multipart/form-data”,只有这样.表单才可能以二进制的形式上传到服务器. <form action = "<%=contextPath%>/file/uploadImage.action" encytype="multipart/form-data"> <input typ

struts2文件上传和下载

1. struts系统中的拦截器介绍 过滤器:javaweb中的服务器组件,主要针对的请求和响应进行拦截. 拦截器:主要针对方法的调用,进行拦截器,当使用代理对象调用某个方法时候 对方法的调用进行拦截,对拦截到的方法可以进行扩展,增强 Struts2中的拦截器主要针对Action中方法的调用进行拦截 1 <interceptors> 2 <!-声明n个拦截器--> 3 <interceptor name="fileUpload" 4 class="

struts2学习(14)struts2文件上传和下载(4)多个文件上传和下载

四.多个文件上传: 五.struts2文件下载: 多个文件上传action com.cy.action.FilesUploadAction.java: package com.cy.action; import java.io.File; import org.apache.commons.io.FileUtils; import com.opensymphony.xwork2.ActionSupport; public class FilesUploadAction extends Actio

Javaweb学习笔记10—文件上传与下载

 今天来讲javaweb的第10阶段学习.文件的上传与下载,今天主要说的是这个功能的实现,不用说了,听名字就是外行人也知道肯定很重要啦. 老规矩,首先先用一张思维导图来展现今天的博客内容. ps:我的思维是用的xMind画的,如果你对我的思维导图感兴趣并且想看到你们跟详细的备注信息,请点击下载 另外:如果图看不清的话请右击---在新窗口中打开会清楚很多 一*, 文件的上传:      1 *分析实现步骤: 1.1* 客户端浏览器通过文件域选择本地要上传的文件. * 点击"上传"按钮

Struts2学习总结——文件上传与下载

Struts2文件上传与下载 1.1.1新建一个Maven项目(demo02) 在此添加Web构面以及 struts2 构面 1.2.1配置Maven依赖(pom.xml 文件) <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20

Struts2(二)文件上传和下载

struts2文件上传和下载 1.创建一个index.jsp界面 和success.jsp上传成功界面 index.jsp <%@ taglib prefix="s" uri="/struts-tags" %> <body> <s:form action="files/add" method="post" enctype="multipart/form-data"> &l

struts2中的文件上传和下载

天下大事,必做于细.天下难事,必作于易. 曾经见过某些人,基础的知识还不扎实就去学习更难的事,这样必然在学习新的知识会很迷惑结果 再回来重新学习一下没有搞懂的知识,这必然会导致学习效率的下降!我写的这篇上传和下载都很基础. 十分适合初学者! jsp:页面 <!--在进行文件上传时,表单提交方式一定要是post的方式,因为文件上传时二进制文件可能会很大,还有就是enctype属性,这个属性一定要写成multipart/form-data, 不然就会以二进制文本上传到服务器端--> <for

struts2 文件上传下载

四.文件的上传(拦截器)和下载(stream结果类型)(需要练一遍) 1.文件上传 必要前提: a.表单method必须是post: b.enctype取值必须是multipart/form-data: c.提供文件选择域. 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <%@ taglib uri="/struts-t