`
ismyhotG
  • 浏览: 15843 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Strtus2文件下载

阅读更多

技术要点
本节代码详细说明文件下载功能的开发流程,介绍知识点如下:

  上传成功页面重修改后支持文件下载代码内容。
  DownloadAction文件下载功能开发。
  struts.xml中DownloadAction配置,以及支持文件名为中文字符的文件下载。
  下载文件流程展示。


演示代码
上传成功页面,这里笔者让其在每个上传文件后提供“下载”链接。

 

<!------------------------文件名:result.jsp------------------->   
<%@taglib prefix="s" uri="/struts-tags"%>   
    <body>   
        上传文件:   
        <table>   
        <!-- 循环显示上传成功文件名 -->   
        <s:iterator value="fileFileName" status="fn">   
        <tr>   
        <td>   
        <!-- 上传成功文件名 -->   
        <s:property />           
        </td>   
        <td>   
        <!-- 下载文件链接内容为定义的下载Action -->   
        <!-- 下载文件名作为链接参数fileName值,用OGNL表达式表达 -->     
        <a href="<s:url value='download.action'>                  
                    <s:param name='fileName'  
 value='fileFileName[#fn.getIndex()]'/>     
                 </s:url>">下载</a>   
        </td>   
        </tr>   
        </s:iterator>        
        </table>         
    </body>  

 

DownLoadAction类代码

<!------------文件名:DownLoadAction.java ------------------>   
import java.io.InputStream;   
import java.io.UnsupportedEncodingException;   
  
import org.apache.struts2.ServletActionContext;   
import com.opensymphony.xwork2.ActionSupport;   
  
public class DownLoadAction extends ActionSupport {   
    //下载文件原始存放路径   
    private final static String DOWNLOADFILEPATH="/upload/";   
    //文件名参数变量   
    private String fileName;   
  
    public String getFileName() {   
        return fileName;   
    }   
  
    public void setFileName(String fileName) {   
        this.fileName = fileName;   
    }   
  
    //从下载文件原始存放路径读取得到文件输出流   
    public InputStream getDownloadFile() {   
        return    
ServletActionContext.getServletContext().getResourceAsStream(DOWNLOADFILEPATH+fileName);   
    }   
    //如果下载文件名为中文,进行字符编码转换   
    public String getDownloadChineseFileName() {   
        String downloadChineseFileName = fileName;   
  
        try {   
            downloadChineseFileName = new String(downloadChineseFileName.getBytes(), "ISO8859-1");   
        } catch (UnsupportedEncodingException e) {   
            e.printStackTrace();   
        }   
  
        return downloadChineseFileName;   
    }   
  
    public String execute() {   
        return SUCCESS;   
    }   
}  

 

struts.xml配置文件中有关文件下载的配置:

<!------------------文件名:struts.xml----------------->   
<struts>   
    <!-- 下载文件的Action定义 -->   
        <action name="download" class="action.DownLoadAction">   
            <!-- 设置文件名参数,由页面上传入 -->   
            <param name="fileName"></param>   
            <result name="success" type="stream">   
                <!-- 下载文件类型定义 -->   
                <param name="contentType">text/plain</param>   
                <!-- 下载文件处理方法 -->   
                <param name="contentDisposition">   
                    attachment;filename="${downloadChineseFileName}"  
                </param>   
                <!-- 下载文件输出流定义 -->   
                <param name="inputName">downloadFile</param>   
            </result>   
        </action>   
</struts>   

 

代码解释
(1)在result.jsp中通过iterator标签和url标签定义了“fileFileName”的循环显示以及链接。其中有关“status”和OGNL表达式笔者会在之后章节里具体介绍,这里只是让读者知道是如何使用标签显示图4.12显示的内容。特别指出<param>标签为downloadAction定义了一个参数,该参数名为“fileName”,因为在4.4.1小节中笔者定义的“fileFileName”是个List类型的数据集合,因此利用OGNL表达式将文件名作为“fileName”参数值传入downloadAction中。
(2)DownLoadAction文件中先定义了常量DOWNLOADFILEPATH,它是下载文件在服务器存放的路径名,也就是4.4.1小节中上传文件在服务器存放的路径名。
定义好DOWNLOADFILEPATH后,在定义DownLoadAction的属性变量。因为在result.jsp中定义了参数“fileName”,则它作为DownLoadAction的属性变量,需要定义相应的getter、setter方法。
然后定义了getDownloadFile方法,它返回的是一个文件流,表明将被下载文件转换为输出流,方便下载。利用Struts2自带的“ServletActionContext”类的API把下载文件存放路径作为方法参数,读取下载文件,将其转换为文件流。
还有一个getDownloadChineseFileName方法,该方法主要作用是将文件名为中文字符的文件进行文件名的字符编码集合转换。因为在Web系统中由JSP等视图页面传入的变量值,特别是中文字符的变量。缺省的字符编码集合都是“ISO8859-1”,因此利用Java的字符串类的API,将字符编码转成开发需要的字符编码集。防止中文字符乱码问题发生。
(3)struts.xml中定义了名为“download”的Action。其中它自己的参数“fileName”因为在这里它的值会从JSP页面上传入,所以这里只是定义,没有具体给它赋任何值
在<result>标签中定义了type属性,值为“stream”。如果是下载文件功能开发,DownLoadAction一定要设置type属性,而且值为“stream”。这是因为在Struts2自带的xml配置文件为struts-default.xml中有关于“stream”的result返回类型的定义,代码如下:

<!-------------------文件名:struts-default.xml-------------->   
<result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/> 

 

这里Struts2定义了result返回类型为“stream”,这个result类型主要是处理文件的输入和输出流时候需要使用的。因为下载文件就是把文件转换成输入输出流,将其从一个文件路径放到另外一个文件路径中去。所以肯定要设置这个result类型的。
“contentType”、“contentDisposition”、“inputName”都是这个result的属性。“contentType”就是文件类型。这里因为下载的文件是文本文件,因此设定的值为文本文件类型,具体各个文件类型如何定义,4.4.1小节已经介绍过,这里不再做说明。“contentDisposition”是指定下载文件处理方式,如图4.13就是处理方式的效果。特别指出如果“contentDisposition”定义的值把前面的“attachment”去掉,则下载方式不是以附件方式下载,如果单击“下载”链接,则会把下载文件的内容显示在浏览器中。读者可以去试验一下。这里有个“${downloadChineseFileName}”,这就是在DownLoadAction中定义getDownloadChineseFileName方法的目的,${downloadChineseFileName}是OGNL的表达式,它显示了“downloadChineseFileName”变量的具体值,因为在DownLoadAction中定义getDownloadChineseFileName方法,则把已经转换成符合需要字符编码集的下载文件名作为下载文件方式对话框中显示的名称,不会造成任何乱码问题。“inputName”是最关键的一个属性,也是一定要定义的属性,“inputName”参数中定义的值“downloadFile”就是DownLoadAction中getDownloadFile方法返回的文件流名字。在Struts2中Acion用前缀名为get的方法得到各种属性的值,这些属性有些是在Action中定义,有些就像本示例在配置文件中利用OGNL表达式或直接定义。
(4)开始进行文件下载功能展示,按照如上记述的步骤执行即可。笔者将两个文本文件上传上去,然后在上传成功页面对具体的文件进行下载。在图4.13中单击“保存”按钮就显示图4.14,选择在本机上存放下载文件的路径即可完成下载文件功能。

分享到:
评论

相关推荐

    struts2文件下载

    在“struts2文件下载”这个主题中,我们主要关注的是如何使用Struts2来实现文件的下载功能。这篇博客文章可能探讨了在Struts2环境下处理文件下载的步骤和技术。 在Struts2中,`DownloadAction.java`很可能是一个...

    struts2实现文件下载功能

    在这个“Struts2实现文件下载功能”的示例中,我们将深入探讨如何利用Struts2框架来实现在web应用中让用户下载文件的功能。 首先,我们需要理解文件下载的基本原理。在Web应用中,当用户点击一个链接或提交一个表单...

    struts2文件上传下载源代码

    在Struts2中,文件上传和下载是常见的功能需求,特别是在处理用户交互和数据交换时。这篇博客文章提供的"struts2文件上传下载源代码"旨在帮助开发者理解和实现这些功能。 文件上传功能允许用户从他们的设备上传文件...

    struts2文件下载实例

    在这个“struts2文件下载实例”中,我们看到如何使用Struts2实现从数据库获取文件信息并在页面上展示,以及提供一个链接让用户能够下载这些文件。以下是对这个实例的详细解释: 1. **数据库操作**: - 首先,`Find...

    Struts2之struts2文件下载详解案例struts012

    在Struts2中处理文件下载是常见的需求,比如用户请求下载服务器上的文件,如PDF、图片或其他类型的文档。本案例"Struts2之struts012"将深入探讨如何在Struts2中实现文件下载的功能。 首先,我们需要创建一个Action...

    struts2文件下载源码

    在Struts2中,文件下载是常见的功能,尤其在处理用户请求获取服务器上的文件时。本示例提供了Struts2实现文件下载的源码,旨在帮助开发者快速理解和实现这一功能。 首先,我们需要理解Struts2文件下载的基本流程: ...

    struts2实现文件上传下载

    本篇文章将详细探讨如何在Struts2框架下实现文件的上传与下载。 首先,我们需要了解Struts2中的文件上传机制。Struts2提供了`FileUploadInterceptor`拦截器来处理文件上传请求。在处理文件上传时,开发者需要在...

    struts2文件下载极其简单struts2文件下载极其简单struts2文件下载极其简单struts2文件下载极其简单

    struts2文件下载极其简单struts2文件下载极其简单struts2文件下载极其简单struts2文件下载极其简单

    Struts2文件下载程序使用框架实现

    在Struts2中实现文件下载功能,可以为用户提供方便的数据传输服务,例如下载PDF、图片、文档等资源。本程序包含两种实现方式:动态下载和静态下载,下面将详细解释这两种方法。 1. 动态下载: 动态下载是通过...

    struts2_uploadify带进度条的多文件上传下载

    总之,这个项目实例为使用Struts2和Uploadify实现带进度条的多文件上传及下载功能提供了一个基础模板,对于学习和实践此类功能的开发者来说是一个有价值的参考。通过深入研究和理解这个项目的代码,可以提升对Struts...

    Struts2+Jquery+Ajax

    "struts2 jar"文件包含了Struts2框架的核心库,可能包括struts2-core、struts2-convention、struts2-json-plugin等依赖,这些是开发Struts2应用必不可少的组件。 "Struts2"可能是项目实例代码,包括Action类、视图...

    struts2中文学习文档

    从给定的文件信息来看,标题“struts2中文学习文档”和描述“struts2的根本webwork2”表明这是一份关于Struts2框架的学习资料,特别强调了Struts2与WebWork2的关系。Struts2是Apache Struts的一个版本,它是一个用于...

    Struts的文件下载

    在Struts中实现文件下载是一项常见的功能,尤其在处理用户请求获取服务器上的静态或动态资源时。这篇博文将深入探讨如何在Struts框架下实现文件下载的功能。 首先,我们需要了解文件下载的基本原理。当用户点击下载...

    struts2 文件下载需要的架包 commons-fileupload-1.2 commons-io-1.3.2

    在Struts2中,处理文件上传和下载是常见的需求。为了实现这一功能,开发人员通常需要依赖两个关键的第三方库:Apache Commons FileUpload和Apache Commons IO。 Apache Commons FileUpload是一个专门用于处理HTTP...

    Struts2 三种下载方法 源码(有图有真相)

    在Struts2中处理文件下载是常见的需求,尤其是在处理用户请求获取服务器上的静态资源或者上传文件的下载时。本资源包提供的源码详细演示了三种不同的文件下载方法。 1. **超链接下载** 超链接下载是最直观且简单的...

    struts2文件下载点击取消服务器报错解决办法

    通过覆写StreamResult的方法 解决struts2文件下载点击取消服务器报错解

    struts2所有jar包程序文件

    在下载并解压"struts2所有jar包"后,开发者需要将lib目录下的所有jar文件添加到项目构建路径中,确保运行时可以找到所有依赖。对于Maven或Gradle用户,可以通过在pom.xml或build.gradle文件中指定相应的依赖项,实现...

Global site tag (gtag.js) - Google Analytics