1. 文件上传与下载

    1.文件上传前提:<form action="${pageContext.request.contextPath}/*" method="post" enctype="multipart/form-data">

    2.动作类中字段需要符合命名规范

        表单字段名:image

        动作类:File image;

         String imageFileName; 文件名

                 String imageContentType;文件的MIME类型

    3.上传拦截器参数的配置

    文件大小、文件类型限制等

    错误消息提示:中文    

    4.多文件上传:File或者List数组

     

  2. 单文件上传

    开发步骤:

    Jsp代码:

    <br/> ----单文件上传----<br/>

    <s:form
    action="uploadOneAction"
    enctype="multipart/form-data">

            <s:textfield
    name="username"
    label="姓名"></s:textfield>

            <s:file
    name="photo"
    label="相片"></s:file>

            <s:submit
    value="上传"></s:submit>

    </s:form>

     

    Struts.xml文件配置代码:

    <package
    name="p1"
    extends="struts-default">

            <action
    name="uploadOneAction"
    class="com.itheima.action.UploadAction1">

                <result>/success.jsp</result>

            </action>

    </package>

     

    动作类代码:

    public
    class
    UploadAction1
    extends ActionSupport {

        // 变量命名需与表单名称保持一致

        private String username;

        // 与表单字段对应,必须是java.io.File类型的

        private File photo;

        // 上传的文件名,格式:上传字段名+FileName

        private String photoFileName;

        // 上传文件MIME类型,格式:上传字段名+ContentType

        private String photoContentType;

     

        public String execute() throws Exception {

            // 打印相关字段属性

            System.out.println(username);

            System.out.println(photo);

            System.out.println(photoFileName);

            System.out.println(photoContentType);

            /*

             * 上传文件步骤:

             * 1.得到上传文件的真实路径

             * 2.构建输入流

             * 3.构建输出流

             */

            // 1.得到上传文件的真实路径

    //上传字段:上传到某个文件夹。存到应用的files目录下

            String storeDir = ServletActionContext.getServletContext().getRealPath(

                    "files");

            // 把上传过来的文件,重写创建一个文件

            File file = new File(storeDir, photoFileName);

     

            /*

            // 以前复制文件的方式

             * 但是现在呢?我们不需要这么做啦,Struts2都帮我们封装了

            InputStream in = new FileInputStream(photo);

            OutputStream out = new FileOutputStream(file);

     

            int
    len = 0;

            byte[] bys = new byte[1024];

            while ((len = in.read(bys)) != -1) {

                out.write(bys, 0, len);

            }

            in.close();

            out.close();

            */

            FileUtils.copyFile(photo, file);

            return
    SUCCESS;

        }

    }

    2、多文件上传

    将文件类型定义为:List 或者File数组

    Jsp代码:

    <br>-----多文件上传-----<br>

    <form
    action="${pageContext.request.contextPath}/upload2.action"
    method="post"
    enctype="multipart/form-data">

        用户名:<input
    type="text"
    name="username"/><br/>

        靓照:<input
    type="file"
    name="photo"/><br/>

        靓照:<input
    type="file"
    name="photo"/><br/>

        <input
    type="submit"
    value="上传"/>

    </form>

     

    Struts.xml文件配置代码:

    <action
    name="upload2"
    class="com.itheima.actions.UploadAction2"
    method="upload">

    <!--             <interceptor-ref name="defaultStack"> -->

    <!--                 <param name="fileUpload.allowedTypes">image/jpeg,image/png</param> -->

    <!--                 <param name="fileUpload.allowedExtensionsSet">jpg,jpeg,png</param> -->

    <!--             </interceptor-ref> -->

                <result>/success.jsp</result>

                <result
    name="error">/error.jsp</result>

                <result
    name="input">/indexMulti.jsp</result>

            </action>

     

    动作类代码:

    //文件上传:fileUpload拦截器完成的

    public
    class
    UploadAction2
    extends ActionSupport {

        

        private String username;

        private File[] photo;//和表单的上传字段名保持一致。类型是File类型的 .数组或List

        private String[] photoFileName;//上传的文件名

        private String[] photoContentType;//上传文件的MIME类型

        public String upload(){

            //上传字段:上传到某个文件夹。存到应用的images目录下

            String realPath = ServletActionContext.getServletContext().getRealPath("/images");

            File directory = new File(realPath);

            if(!directory.exists()){

                directory.mkdirs();

            }

            try {

                for(int
    i=0;i<photo.length;i++){

                    FileUtils.copyFile(photo[i], new File(directory, photoFileName[i]));

                }

                return
    SUCCESS;

            } catch (IOException e) {

                e.printStackTrace();

                return
    ERROR;

            }

        }

    }

     

     

     

    3、原理分析:

    a、是由一个拦截器来完成的。fileUpload

    可以通过配置拦截器的参数,指定拦截的扩展名或文件的MIME类型

    <action
    name="uploadOneAction"
    class="com.itheima.action.UploadAction1">

                <interceptor-ref
    name="defaultStack">

                <!--对已有的拦截器注入参数 -->

                <param
    name="fileUpload.allowedExtensions">txt</param>

                </interceptor-ref>

                <result>/success.jsp</result>

    </action>

     

    b、超出大小或非法文件的上传,会报错(转向一个input的视图)

     

    通过:

    <s:actionError/> <s:feildError/>显示错误消息的提示

    c、错误消息提示改为中文版:借助国际化的消息资源文件

     

    如果是通过配置全局默认参数引起的错误,最好用全局的消息资源文件。

     

     

    struts2默认的提示资源文件:struts2-core-**.jar 的org.apache.struts2的struts-message.properties文件中。比着key值覆盖对应的value即可。

    4、文件下载

    原理:是一个结果类型来处理的。stream

     

    编码步骤:

    动作类:

    public
    class
    DownloadAction
    extends ActionSupport {

        // 文件下载用到的输入流

        private InputStream imageFileIn;

        // 记住下载文件的文件名

        private String fileName;

     

        public String download1() throws Exception {

            // 给输入流赋值即可

            String realPath = ServletActionContext.getServletContext().getRealPath(

                    "/file/mm.jpg");

            // c:\apacher\file\4.jpg

            fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);

            // 解决中文名称乱码文件

            fileName = URLEncoder.encode(fileName, "UTF-8");

            imageFileIn = new FileInputStream(realPath);

            return
    SUCCESS;

        }

    }

     

    struts.xml配置文件:主要是对stream类型的结果进行配置

    <action
    name="download1"
    class="com.itheima.action.DownloadAction"
    method="download1">

                <result
    type="stream">

                    <!--动作类中InputStream的字段名 -->

                    <param
    name="inputName">imageFileIn</param>

                    <!-- 告知浏览器响应头:文件的MIME类型 -->

                    <param
    name="contentType">application/octet-stream</param>

                    <!--告诉浏览器下载的方式 -->

                    <!-- 使用OGNL表达式获取动作类中的属性 -->

                    <param
    name="contentDisposition">attachment;filename=${fileName}</param>

                </result>

    </action>

     

十六、Struts2文件上传与下载的更多相关文章

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

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

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

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

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

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

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

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

  5. java web学习总结(二十四) -------------------Servlet文件上传和下载的实现

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

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

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

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

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

  8. Struts2学习(六)———— 文件上传和下载

    一.单文件上传 在没学struts2之前,我们要写文件上传,非常麻烦,需要手动一步步去获取表单中的各种属性,然后在进行相应的处理,而在struts2中就不需要了,因为有一个fileUpload拦截器帮 ...

  9. Struts2文件上传与下载

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

随机推荐

  1. $.ajax()中dataType

    $.ajax()中dataType的默认值为TEXT,如果没有指明json,而返回来的数据又就是json格式,则无法显示.!!

  2. jsp自定义标签1

    1.编写一个实现tag接口的java类 package cn.itcast.web.tag; import java.io.IOException; import javax.servlet.http ...

  3. 那些不能错过的Xcode插件

      来源:http://www.cocoachina.com/applenews/devnews/2013/0918/7022.html 古人云“工欲善其事必先利其器”,打造一个强大的开发环境,是立即 ...

  4. ruby字符串学习笔记5

    1获取字符串某部分 s = "My kingdom for a string!" s.slice(3,7) # kingdom s[3,7] # kingdom s[/.ing/] ...

  5. 第4章 管道和FIFO

    4.1 管道 管道是由pipe函数创建的,提供一个单向数据流. 头文件 #include <unistd.h> 函数原型 int pipe(int fd[2]); 返回值 成功则为0,出错 ...

  6. 什么是bower

    Bower是一个客户端技术的软件包管理器,它可用于搜索.安装和卸载如JavaScript.HTML.CSS之类的网络资源.其他一些建立在Bower基础之上的开发工具,如YeoMan和Grunt,这个会 ...

  7. arp -s 157.55.85.212 00-aa-00-62-c6-09 .... Adds a static entry.

    ARp是一个重要的TCp/Ip协议,并且用于确定对应Ip地址的网卡物理地址.实用arp命令,我们能够查看本地计算机或另一台计算机的ARp高速缓存中的当前内容.此外,使用arp命令,也可以用人工方式输入 ...

  8. VisualVM连接远程Java进程

    jstatd是一个RMI(Remove Method Invocation)的server应用,用于监控jvm的创建和结束,并且提供接口让监控工具(如VisualVM)可以远程连接到本机的jvms . ...

  9. nginx 反向代理(Reverse Proxy)与耗时记录

    反向代理服务器位于实际的服务器之前,他能够缓存服务器响应,加速访问,同时也启到了负载均衡服务器的效果.反向代理服务器解析客户端请求,根据负载均衡算法转发到不同的后台服务器上.用户和后台服务器之间不再有 ...

  10. .NET 集合操作性能

    如果单元格的内容是na(not applicatable),就表示这个操作不能应用于这种集合类型.