一,页面 index.html

在页面中最重要的就是这个文件上传用的 form 表单,注意这里一定要把 form 的encyType属性明确标定为“multipart/form-data”,只有这样。表单才可能以二进制的形式上传到服务器。

<form action = "<%=contextPath%>/file/uploadImage.action" encytype="multipart/form-data">
    <input type="file" name="upload"/>
    <input type="submit" value="上传"/>
</form>

  

二,业务处理类 FileAction

1,当页面中的文件上传表被提交时,上传的文件会被Struts拦截器处理。并被填充到与页面中相应的<input type="file">标签的name属性相同的File类型的属性中。因为上面的index.html页面中相应的标签name属性值为“upload”,那么在下面的程序中对应的属性就是这个 private File upload 属性。

同时有两个相关的string类型的属性也将被填充。一个是 String ##FileName属性(保存有上传文件的原名),一个是String ##ContentType属性(保存了上传文件的内容类型,如“text/plain”,"image/png")。##代表的同样是页面中相应的<input type="file">标签的name属性值。so,现在你已经拿到了代表被上传文件的 File 类型对象。现在你可以把它保存到本地文件夹,甚至上传到FTP服务器 (如果要操作FTP服务器,推荐使用Apache组织的 comment-net 工具包) 。

2,当要从服务器下载文件时,情况稍有不同。当下载时,Action业务类中相应的方法不可以再返回String类型的返回值,应当返回一个 InputStream 流对象。这个流对象的内容就应该是要被下载的文件(参见下面程序中的)。

public class FileAction extends ActionSupport{
    private File upload;
    private String uploadFileName;
    private String uploadContentType;
    //**不要忘了为这三个属性设置setter和getter方法**//

    /**
    * 文件存储过程
    */
        public String uploadFile(){
        //存储文件。。。。。。
        System.out.println(uploadFileName);
        return "success";
    }

    /**
    * 文件下载
    * @return 返回代表文件的输入流(为什么会返回输入流而不是输出流,因为写程序时请注意你的位置一直是“内存”,应    * 该站在内存的位置思考问题。现在要从存储介质上读取数据到服务器内存,然后再由服务器发送到客户端。所以从内存    * 的角度看,此方法的作用是在读入文件到内存。所以应当是文件输入流,文件内容流向你所在的位置。)
    */
    public InputStream getDownloadFile(){
        InputStream file = ********;//读取文件
        return ;
    }
}

  

三,struts.xml 配置文件

当使用Struts2进行文件上传时,在配置文件中并不能看出与普通action有何区别,这使得使用Struts2上传文件变得简单并普通。

当使用Struts2进行文件下时,情况略有不同,但是与普通Action的差别并不是很大,差别有以下几点:

1,此action不要指定method属性(原因见下面)。

2,该action只有一个result,且其name属性指定为“success” type属性必须为“stream”

3,这个唯一的result的内容不是一个页面路径。而是四个 param 属性

(1)contentType 指定下载内容的MIME类型

(2)contentDisposition 可以在此指定下载后的文件名称

(3)inputName 指定输入流的来源,上文说的不要为此action指定method就是因为这个属性的原因,在上面的FileAction类中 有个 getDownLoad 方法,下面xml文件中指定的inputName属性的值就是指定了这个方法。而这个方法正好返回一个InputStream对象。

(4)bufferSize 缓冲区大小。这个就不多说了。

<package name="file" namespace="/file" extends="struts-default">
    <action name="uploadImage" class="org.toybrick.strutsfile.FileAction" method="uploadFile">
        <result name="input">/index.html</result>
    </action>
    <action name="download" class="org.toybrick.strutsfile.FileAction">
        <result name="success" type="stream">
            <param name="contentType">image/png</param>
            <param name="contentDisposition">filename="iamge.png"</param>
            <param name="inputName">downloadFile</param>
            <param name="bufferSize">2048</param>
        </result>
    </action>
</package>

  

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. struts2学习(13)struts2文件上传和下载(1)

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

  8. struts2文件上传和下载

    1. struts系统中的拦截器介绍 过滤器:javaweb中的服务器组件,主要针对的请求和响应进行拦截. 拦截器:主要针对方法的调用,进行拦截器,当使用代理对象调用某个方法时候 对方法的调用进行拦截 ...

  9. 笔记:Struts2 文件上传和下载

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

随机推荐

  1. arcgis desktop 10.1 license manager无法启动问题解决

    19:44:36 (ARCGIS) Vendor daemon can't talk to lmgrd (License server machine is down or not respondin ...

  2. ExtJs 实现表单联动

    最近做的项目使用Extjs.遇到表单联动的业务.下面来说说主要实现思想: 说明:表单联动一般存在从属关系,有大范围的对象和大范围中的小对象.比如地理位置的选定(例:浙江省-杭州市-某某县).在这里,我 ...

  3. 统计SqlServer每张表内的数据量

    CREATE TABLE #temp (TableName VARCHAR (255), RowCnt INT)EXEC sp_MSforeachtable 'INSERT INTO #temp SE ...

  4. 什么叫session和cookie-及其设置

    http的无状态? 保持状态, 是指当程序关闭后重启, 上一次操作的历史还能继续, 保持的. 如word中的 "选项"设置. 如windows系统的设置等等. http的设计目的, ...

  5. Shader 学习笔记

    Shader "Custom/Diffuse Texture" { // Shader的开始,双引号内饰该Shader的名字 Properties { _MainTex (&quo ...

  6. NoClassDefFoundError vs ClassNotFoundException

    我们先来认识一下Error 和Exception, 两个都是Throwable类的直接子类.  Javadoc 很好的说明了Error类: An Error is a subclass of Thro ...

  7. [Mechine Learning & Algorithm] 集成学习方法——Bagging和 Boosting

    使用机器学习方法解决问题时,有较多模型可供选择. 一般的思路是先根据数据的特点,快速尝试某种模型,选定某种模型后, 再进行模型参数的选择(当然时间允许的话,可以对模型和参数进行双向选择) 因为不同的模 ...

  8. 1.1ASP.NET Web API 2入门

    HTTP 不只是为了生成 web 页面.它也是建立公开服务和数据的 Api 的强大平台.HTTP 是简单的. 灵活的和无处不在.你能想到的几乎任何平台有 HTTP 库,因此,HTTP 服务可以达到范围 ...

  9. MongoDB C Driver使用教程

    MongoDB C Driver使用教程 转载请注明出处http://www.cnblogs.com/oloroso/ 本指南提供简介 MongoDB C 驱动程序. 在 C API 的详细信息,请参 ...

  10. C#转义字符(Z)

    所有的ASCII码都可以用“\”加数字(一般是8进制数字)来表示.而C中定义了一些字母前加"\"来表示常见的那些不能显示的ASCII字符,如\0,\t,\n等,就称为转义字符,因为 ...