Struts2 下载文件

文件下载最简单的方法就是直接在页面上给出一个超链接,该链接的href属性为服务器上文件的路径。

如果需要对用户下载之前进行进一步的检查,比如判断用户是否有足够的权限来下载该文件等,普通下载是无能为力了。

但如果该文件的文件名为中文,则会导致悲剧的404! 而Struts下载就可以轻松实现!

一下午就在实验室看《Struts2.1权威指南》,这本书看似很厚,但内容真的不行,很多地方都没说清楚(一张Struts上传下载文件,90%讲的是用Struts上传。。。-.-),本来一个很简单的Struts2下载文件,浪费了一个下午,最后还有一个奇怪的问题怎么也解决不了,是关于上传路径的,网上也找不到相关资料,感觉应该是IDE的问题,不过对项目及Struts2下载文件不产生任何影响。

struts.xml
有4个重要的属性
contentType:指定被下载文件的文件类型
inputName:指定被下载文件的入口输入流
contentDisposition:制定被下载文件的文件名
bufferSize:缓冲大小

代码样例如下:

<package name=“download”  extends=“struts-default”>
    <action name=“download” class=“downloadFileAction”>
            <result name=“success” type=“stream”>
                <param name=“contentType”>
                    application/octet-stream
                </param>
                <param name=“inputName”>inputStream</param>
                <param name=“contentDisposition”>
                    attachment;filename=”${downloadName}”
                </param>
                <param name=“bufferSize”>4096</param>
            </result>
        </action>
</package>

下面来看实现下载的Action代码:

public class DownloadFileAction extends ActionSupport {
    private ResourceService resourceService;
    private int id;
    private String fileName;
    private String downloadName;

    //省略Getter和Setter方法
    //两个重要方法
    public String execute() throws Exception {
        String[] info=new String[2];
        info=resourceService.download(id);
        downloadName=info[1];
        fileName=info[0];
        return SUCCESS;
    }
    public InputStream getInputStream() {
        InputStream in = ServletActionContext.getServletContext().getResourceAsStream(fileName);
        System.out.println(in);
        return in;
    }
}

 

downloadName和配置文件中的${downloadName}对应,是下载文件名,即弹出对话框中的显示的文件名;
fileName是服务器保存指定文件的绝对路径,在Action中形成InputStream

我是根据前台(jsp页面)传来的id,在service层调用dao层从数据库中得到本地文件的地址及文件名,不知道实际开发是不是应该这样做,那破书只字不提,网上教程也都是事先指定好下载文件名,但这样对实际开发没有意义。

Struts2实现下载文件就是这样,还是比较清晰的,权限问题可以用Struts拦截器轻松实现。

无觅相关文章插件,快速提升流量

关于 异泪

shikailun@gmail.com
, ,

有 2 条《Struts2 下载文件》的回复

  1. 大月 | #1

    “我是根据前台(jsp页面)传来的id,在service层调用dao层从数据库中得到本地文件的地址及文件名,不知道实际开发是不是应该这样做”
    偶就是这么做的,可以看我写的DownloadAction,比较讨厌的是这里有个乱码问题,需要转码。

    • sigh,我去看看你的~~
      上次碰到了乱码,没理它,本来还想给FFJ检查作业的时候用英文文件的。。。

发表评论