Struts2学习笔记整理(四)

Struts2上传下载

文件上传

如果想使用HTML表单上传文件(一个或多个),那么必须把HTML表单的enctype属性设置成multipart/form-data,且method=post, 且使用<input type="file">.

在Struts里,我么使用FileUpload拦截器和 Jakarta Commons FileUpload 组件可以完成文件的上传.

步骤:1.在jsp中使用file标签,如果上传一个文件就写一个,多个文件的话使用多个file标签,但是它们的名字相同.

2.在action中添加3个和文件上传相关的属性  且格式固定

private File uploadImage; //上传的文件
private String uploadImageContentType;  //上传的文件的类型
private String uploadImageFileName;     //上传文件的名称

其中    uploadImage是jsp页面file的名字 <input type="file" name="uploadImage">

如果是上传单个文件, uploadImage属性的类型就是 java.io.File, 它代表被上传的文件, 第二个和第三个属性的类型是 String, 它们分别代表上传文件的文件名和文件类型 定义方式是分别是jsp页面file组件的名称+ContentType,jsp页面file组件的名称+FileName

如果上上传多个文件, 可以使用数组或 List

一.单文件的上传

  1. 首先需要导包 commons-fileupload-1.2.1.jar,commons-io-1.3.2.jar
  2. 把form表单的ectype属性设置成multipart/form-data  method设置成post  代码如下

    <form action="${pageContext.request.contextPath}/upload/uploadAction_saveFile.action"
              name="form1"  method="post"  enctype="multipart/form-data" >
                 上传文件名称:<input type="file" name="uploadImage">
               <input type="submit" value="上传">
     </form>
  3. 在action表单中添加如下属性,且文件名字必须与表单中字段对应

    public class UploadAction{
      private File uploadImage;//得到上传的文件

    private String uploadImageContentType;//得到文件的类型

    private String uploadImageFileName;//得到文件的名称

     //这里略省了属性的getter/setter方法public String saveFile() throws Exception{

    /**servletContext提供了标准的Servlet运行环境,其实就是一些servlet和web 容器进行通信的方法。

    ServletActionContext 其实是ActionContext的子类,其功能脱胎于ActionContext,对ActionContext的方法做了一定的包装,提供了更简便直观的方法。

    ActionContext来源于Struts2,ActionContext就是为了弥补strtus2 action跳出标准servlet框架而造成的和WEB环境失去联系的缺陷。 */

    ServletContext sc = ServletActionContext.getServletContext();

    String realpath = sc.getRealPath(“/uploadfile”); //目标路径 存储到哪里

    try {

    File destFile = new File(realpath, uploadImageFileName);//在目标路径下创建文件

    FileUtils.copyFile(uploadImage, destFile);//将文件拷贝到目标文件中  uploadImage-->destFile

    } catch (IOException e) {

    e.printStackTrace();

    }

    return "success";}}

    值得注意的是我这里的目标路径是肯定存在的,如果开发中我们要进行判断是不是存在,不存在则创建.

  4. 设置上传文件的最大值在struts.xml文件加载该资源文件
       <!-- 设置comonFileupload上传组件允许的文件大小 才能测试出上传文件过大出现的错误信息
             默认值是2M-->
       <constant name="struts.multipart.maxSize" value="86170804"/>

5.在struts.xml文件中增加如下配置

 <package name="upload" namespace="/upload" extends="struts-default" >
          <!-- 单文件上传 -->
        <action name="uploadAction_*" class="cn.itcast.upload.UploadAction" method="{1}">
           <result name="success">/upload/success.jsp</result>

           <!-- 定义上传出错要转向的页面 -->
           <result name="input">/upload/error.jsp</result>
       </action>
 <package>

File Upload 拦截器

  • File Upload拦截器负责处理文件的上传操作,它是默认的defaultStack拦截器粘的一员
  • File Upload有三个属性可以设置   maximumSize:上传最大长度(单位是字节),默认是2MB  allowedTypes:上传文件的类型 ,用","分割 allowedExtensions:文件扩展名.","分割
  • 若用户上传的文件大小大于给定的最大长度或其内容类型没有被列在 allowedTypes, allowedExtensions 参数里, 将会显示一条出错消息. 与文件上传有关的出错消息在struts-messages.properties 文件里预定义.  (org.apache.struts2包下)
  • 可以在文件上传 Action 相对应的资源文件中重新定义错误消息, 但需要在 struts.xml 文件中配置使用 action 的消息:

在jsp页面显示错误信息

在struts.xml文件中根据 <result name=“input”>/upload/error.jsp</result>中所指向的error.jsp页面可以使用<s:fielderror/>显示错误信息

自定义错误信息

  1. 创建新的资源文件 例如message_zh_CN.properties,放置在src下在该资源文件中增加如下信息

    struts.messages.error.uploading=上传错误: struts.messages.error.file.too.large=上传文件太大: struts.messages.error.content.type.not.allowed=上传文件的类型不允许:
    struts.messages.error.file.extension.not.allowed=上传文件的后缀名不允许: 
  2. 在struts.xml文件加载该资源文件
    <constant name="struts.custom.i18n.resources" value="message"></constant>

    message意思为以message开头的属性配置文件,中文的文件名为:message_zh_CN.properties

多文件上传

多文件上传和单文件上传的区别主要在于action的处理

多文件上传的aciton

public class uploadAction{
  //多文件所以用的是数组的形式  private File[] uploadImages;//得到上传的文件
  private String[] uploadImagesContentType;//得到文件的类型
  private String[] uploadImagesFileName;//得到文件的名称
  //这里略省了属性的getter/setter方法
  public String saveFiles() throws Exception{
        ServletContext sc = ServletActionContext.getServletContext();
         String realpath = sc.getRealPath("/uploadfile");
        try {
            if(uploadImages!=null&&uploadImages.length>0){
                 for(int i=0;i<uploadImages.length;i++){
                         File destFile = new File(realpath,uploadImageFileNames[i]);
                         FileUtils.copyFile(uploadImages[i], destFile);
                  }
             }
         } catch (IOException e) {
              e.printStackTrace();}return "success";}}

文件的下载

  • struts2提供了stream结果类型,该结果类型就是专门用于支持文件下载功能的
  • 指定stream结果类型 需要指定一个 inputName参数,该参数指定一个输入流,提供被下载文件的入口

DownLoadAction.java

package com.action;

import java.io.InputStream;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class DownloadAction extends ActionSupport{
    private static final long serialVersionUID = 1L;
    //文件路径
    private String path;

    //path属性的getter方法
    public String getPath(){
        return path;
    }
    //path属性的setter方法
    public void setPath(String path){
        this.path = path;
    }
    //返回inputstream,文件下载关键方法
    public java.io.InputStream getDownloadFile() throws Exception{
        InputStream in = ServletActionContext.getServletContext().getResourceAsStream(getPath());
        return in;
    }
    public String execute() throws Exception{
        return SUCCESS;
    }
}

Struts.xml配置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
     <!-- 配置 Struts 2 应用中的常量 -->
     <constant name="struts.i18n.encoding" value="UTF-8" />
         <!-- 配置上传文件的最大容量,struts2默认为2M。单位是1B, 1KB=1024B,1M=1024KB,1M=1024*1024B-->
         <constant name="struts.multipart.maxSize" value="1048576" />

     <!-- 配置本应用中的包,继承 struts-default 包 -->
     <package name="FileDownload" namespace="/" extends="struts-default">
         <action name="download" class="com.action.DownloadAction">
             <!-- 设置文件路径的参数,传到action类文件中去 -->
             <!-- <param name="path">\download\a.jpg</param> -->
             <!-- 下载文件类型定义,即定义为“stream” -->
             <result name="success" type="stream">
                 <!-- image/jpeg代表JPG图片 -->
                 <param name="contentType">image/jpeg</param>
                 <!-- 下载文件处理方法 -->
                 <param name="contentDisposition">
                     <!-- attachment表示附件方式,即下载时打开保存对话窗,filename表示下载时显示的保存时的文件名 -->
                         <!-- 如果不写attachment;或者是写的是inline; 则表示内联,即会在浏览器中尝试打开下载的文件,而不是下载-->
                     attachment;filename="a.jpg"
                 </param>
                 <!-- 下载文件输出流定义 -->
                     <!-- 这里的inputName元素所对应的value值downloadFile,在action中一定要有对应的getDownloadFile()方法 -->
                 <param name="inputName">downloadFile</param>
                 <!-- 下载缓冲区的大小 -->
                 <param name="bufferSize">1024</param>
             </result>
         </action>
     </package>
</struts>    

index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>首页</title>
  </head>
  <body>
    <center>
         欢迎来到首页,点下面链接去下载一个文件<br />
         <a href="download.action?path=<%="./download/a.jpg" %>">下载</a>&nbsp;&nbsp;&nbsp;
    </center>
  </body>
</html>

文件路径

项目中要提前建立好download目录,和里面要存在有a.jpg文件,否则,下载会失败。

功能入口

项目发布到服务器后,用浏览器访问项目中的index.jsp ,点击下载链接,就可以弹出“下载”对话框。

到此Strtus2文件的上传和下载我们基本了解了.

原文地址:https://www.cnblogs.com/daweige/p/8118406.html

时间: 2024-10-14 18:50:53

Struts2学习笔记整理(四)的相关文章

Python学习笔记整理(四)Python中的字符串..

字符串是一个有序的字符集合,用于存储和表现基于文本的信息. 常见的字符串常量和表达式 T1=‘’ 空字符串 T2="diege's" 双引号 T3="""...""" 三重引号块 T4=r'\temp\diege' Raw字符串 抑制(取消)转义,完全打印\tmp\diege,而没有制表符 T5=u’diege' Unicode字符串 T1+T2     合并 T1*3    重复 T2[i]    索引 T2[i:j] 分片

Struts2学习笔记整理(二)

这里是重点. Action接口 struts2 的Action可以是POJO 为了让用户开发的Action更加规范struts2提供了一个Action接口 ActionSupport基类 Struts2为Action接口提供了一个实现类 ActionSupport,定义了 表单域校验.错误信息设置和获得国际化信息相关一些方法 我们写的action可以有以下几种选择: Action 可以是 POJO 用户编写Action 可以实现Action接口    可以使用结果集常量字符串 用户编写Actio

[struts2学习笔记] 第四节 学着使用struts 2的tag标签

本文地址:http://blog.csdn.net/sushengmiyan/article/details/40349201 官方文档: http://struts.apache.org/release/2.3.x/docs/hello-world-using-struts-2.html 本文作者:sushengmiyan --------------------------------------------------------------------------------------

Python学习笔记整理四--字符串类型

定义:元素以引号包围的.元素可以是任意类型的有序的不可修改的序列: 定义字符串: str()  如:a = str(1234) ''     如:a = 'nihao' ""    如:a = "nihao" ''' ''', """ """ 如:a = '''nihao''', a = """nihao""" 注意: 当需要用到缩写如I'm时,就

Deep Learning(深度学习)学习笔记整理系列之(四)

Deep Learning(深度学习)学习笔记整理系列 [email protected] http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04-08 声明: 1)该Deep Learning的学习系列是整理自网上很大牛和机器学习专家所无私奉献的资料的.具体引用的资料请看参考文献.具体的版本声明也参考原文献. 2)本文仅供学术交流,非商用.所以每一部分具体的参考资料并没有详细对应.如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主

Deep Learning(深度学习)学习笔记整理系列四

Deep Learning(深度学习)学习笔记整理系列 声明: 1)该Deep Learning的学习系列是整理自网上很大牛和机器学习专家所无私奉献的资料的.具体引用的资料请看参考文献.具体的版本声明也参考原文献. 2)本文仅供学术交流,非商用.所以每一部分具体的参考资料并没有详细对应.如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主删除. 3)本人才疏学浅,整理总结的时候难免出错,还望各位前辈不吝指正,谢谢. 4)阅读本文需要机器学习.计算机视觉.神经网络等等基础(如果没有也没关系了,没

Deep Learning(深度学习)学习笔记整理系列七

Deep Learning(深度学习)学习笔记整理系列 声明: 1)该Deep Learning的学习系列是整理自网上很大牛和机器学习专家所无私奉献的资料的.具体引用的资料请看参考文献.具体的版本声明也参考原文献. 2)本文仅供学术交流,非商用.所以每一部分具体的参考资料并没有详细对应.如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主删除. 3)本人才疏学浅,整理总结的时候难免出错,还望各位前辈不吝指正,谢谢. 4)阅读本文需要机器学习.计算机视觉.神经网络等等基础(如果没有也没关系了,没

Deep Learning(深度学习)学习笔记整理系列之(五)

Deep Learning(深度学习)学习笔记整理系列 [email protected] http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04-08 声明: 1)该Deep Learning的学习系列是整理自网上很大牛和机器学习专家所无私奉献的资料的.具体引用的资料请看参考文献.具体的版本声明也参考原文献. 2)本文仅供学术交流,非商用.所以每一部分具体的参考资料并没有详细对应.如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主

Deep Learning(深度学习)学习笔记整理系列之(三)

Deep Learning(深度学习)学习笔记整理系列 [email protected] http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04-08 声明: 1)该Deep Learning的学习系列是整理自网上很大牛和机器学习专家所无私奉献的资料的.具体引用的资料请看参考文献.具体的版本声明也参考原文献. 2)本文仅供学术交流,非商用.所以每一部分具体的参考资料并没有详细对应.如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主