当前位置: 首页 > 图文教程 > Java技术 > Java Web开发 > 浅谈Struts实现文件的下载

Java Web开发
浅谈http的无状态性
JFreeChart常用函数
为什么主流Java MVC框架如此难以使用
软件工程
JavaScript 中IE与FireFox不同之处
关于javascript 的贪婪与非贪婪模式
abstract class和interface的区别
java 写的一个蜘蛛程序
javascript 基本用法简介
java web开发中构建SOAP服务
用java匿名类来简化调试
Java Web开发构想
Java Web 开发的配置详解
WEB开发中的JAVA字符编码经验总结
孙鑫老师原创:Struts 2初体验
Hibernate常见的20个问题
关于Xdoclet生成hibernate映射文件
JAVA四种基本排序
提高Java代码可重用性的三个措施
孙鑫老师原创:XML Schema初窥(一)

Java Web开发 中的 浅谈Struts实现文件的下载


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-12-26   浏览: 439 ::
收藏到网摘: n/a

今天要和大家分享的是Struts中的文件下载,我主要说以下3种方法,原始超链接下载文件、Struts2提供的文件下载以及Struts2下载前的授权控制。

1,原始超链接下载文件

文件下载最简单的方法就是直接在页面上给出一个超链接,该链接的href属性等于要下载文件的文件名,就可以了。但如果该文件的文件名为中文,则会导致下载失败,或者应用程序需要在用户下载之前进行进一步的检查,比如判断用户是否有足够的权限来下载该文件等。

 

HTML页面的代码如下:

 

<body>

<h1>原始的下载</h1>

<ul>

<li> <!-- 包含中文文件名的下载链接 -->

要下载的文件:<a href="images/费用申请单.doc">费用申请单</a>

要下载的文件:<a href="images/application.doc">application</a>

</li>

</ul>

</body>

 

这里中文名的文件是下载不了的。

 

2Struts2提供的文件下载

 

Struts2可以提供中文名文件下载的支持,HTML页面代码如下:

 

<body>

    <h1>Struts2的文件下载</h1>

    <ul>

    <li>

        下载中文名称的文件:<a href="download.action">下载中文名称文件</a>

    </li>

    </ul>

</body>

 

Action代码如下:

 

package com.annlee.upload;

 

import java.io.InputStream;

 

import org.apache.struts2.ServletActionContext;

 

import com.opensymphony.xwork2.ActionSupport;

 

public class DownloadAction extends ActionSupport {

//该属性是依赖注入的属性,可以在配置文件中动态指定该属性值

private String inputPath;

//依赖注入该属性值的set方法

 

public String getInputPath() {

   return inputPath;

}

 

public void setInputPath(String inputPath) {

   this.inputPath = inputPath;

}

 

public String execute() throws Exception{

   return this.SUCCESS;

}

 

/**

* 下载用的action应该返回一个InputStream实例,该方法对应在result里的inputName属性值为targetFile

*/

public InputStream getTargetFile() throws Exception{

   return ServletActionContext.getServletContext().getResourceAsStream(this.inputPath);

}

}

 

struts.xml文件中的配置如下:

 

        <action name="download" class="com.annlee.upload.DownloadAction">

        <!-- 指定被下载资源的位置 -->

        <param name="inputPath">\images\struts-.zip</param>

        <!-- 配置结果类型为stream的结果 -->

        <result name="success" type="stream">

           <!-- 指定下载文件的文件类型 -->

           <param name="contentType">application/zip</param>

           <!-- 指定下载文件的文件位置 -->

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

           <!-- 指定文件下载后的名称,中文还是显示不了 -->

           <param name="contentDisposition">filename="struts-.zip"</param>

           <!-- 指定下载文件的缓冲区大小 -->

           <param name="bufferSize">4096</param>

        </result>

        </action>

 

从上面可以看到配置该action的关键是需要配置一个类型为stream的结果,配置时要指定以下四个属性:

 

contentType, inputName, contentDisposition, bufferSize因为stream结果类型的逻辑视图是返回给客户端一个输入流,因此不需要指定location属性。

 

3Struts2下载前的授权控制

 

我们可以看到execute()方法是直接返回的,我们可以在这里加上授权控制的代码,如下:

 

public String execute() throws Exception{

   //判断用户是否登录,如果session中的用户为空,就返回登录页面

   if(null == ActionContext.getContext().getSession().get("user")){

 

//这里可以添加错误提示

    ActionContext.getContext().put("downloadError", "你还没有登录,请登录后再下载!");

    return "login";

   }

   return this.SUCCESS;

}

 

当然还在要struts.xmlaction里加上login的返回视图。

 

        <action name="download" class="com.annlee.upload.DownloadAction">

        <!-- 指定被下载资源的位置 -->

        <param name="inputPath">\images\struts-.zip</param>

        <!-- 配置结果类型为stream的结果 -->

        <result name="success" type="stream">

           <!-- 指定下载文件的文件类型 -->

           <param name="contentType">application/zip</param>

           <!-- 指定下载文件的文件位置 -->

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

           <!-- 指定文件下载后的名称,中文还是显示不了 -->

           <param name="contentDisposition">filename="struts-.zip"</param>

           <!-- 指定下载文件的缓冲区大小 -->

           <param name="bufferSize">4096</param>

        </result>

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

        </action>