您的位置:首页 > 编程语言 > Java开发

Struts2控制文件下载

2008-12-05 13:58 337 查看
(一)简单控制下载

fileDown.html

<a href="download.action">下载压缩文件</a>          

struts.xml

    <constant name="struts.i18n.encoding" value="GBK"/>

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

        <action name="upload" class="jCuckoo.UploadAction">

            <interceptor-ref name="fileUpload"> 

                <param name="allowedTypes">image/bmp,image/png,image/gif,image/jpeg</param> 

                <param name="maximumSize">20000</param> 

            </interceptor-ref> 

            <interceptor-ref name="defaultStack"/>   

            <!-- 保存路径savePath依赖注入 -->         

            <param name="savePath">/upload</param>

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

            <result>/succ.jsp</result>  

        </action>

         <action name="download" class="jCuckoo.FileDownloadAction">

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

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

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

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

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

            </result>

        </action>

    </package>
这个action特殊的地方在于result的类型是一个流(stream),配置stream类型的结果时,因为无需指定实际的显示的物理资源,所以无需指定location属性,只需要指定inputName属性,该属性指向被下载文件的来源,对应着Action类中的某个属性,类型为InputStream。下面则列出了和下载有关的一些参数列表:
参数说明
contentType

内容类型,和MIME标准中的规定一致,例如text/plain代表纯文本,text/xml表示XML,image/gif代表GIF图片,image/jpeg代表JPG图片

inputName

下载文件的来源流,对应着action类中某个类型为Inputstream的属性名,例如取属性inputStream需要提供getInputStream()方法

contentDisposition

文件下载的处理方式,包括内联(inline)和附件(attachment)两种方式,而附件方式会弹出文件保存对话框,否则浏览器会尝试直接显示文件。
attachment;filename="XXX.XXX",表示文件下载的时候保存的名字应为XXX.XXX。如果直接写filename="XXX.XXX",那么默认情况是代表inline,浏览器会尝试自动打开它,等价于这样的写法:inline; filename="XXX.XXX"

bufferSize

下载缓冲区的大小。
在这里面,contentType属性和contentDisposition分别对应着HTTP响应中的头Content-TypeContent-disposition头。

FileDownloadAction.java

public class FileDownloadAction implements Action {

    private String inputPath = //images//中.zip;   //可以通过查找数据库获取

    public void setInputPath(String inputPath) {

        this.inputPath = inputPath;

    }

    /** 提供转换编码后的供下载用的文件名 */

    public String getDownloadFileName() throws UnsupportedEncodingException {

        String downFileName = null;

        int i = inputPath.lastIndexOf('//');

        downFileName = inputPath.substring(i + 1);

        downFileName = new String(downFileName.getBytes(), "ISO8859-1");

        return downFileName;

    }

    /*

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

     */

    public InputStream getTargetFile() throws Exception {

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

    }

    public String execute() throws Exception {

        return SUCCESS;

    }

}
(二)如果要实现下载授权控制
只需要将上面的execute()进行简单修改即可

    public String execute() throws Exception

    {

        ActionContext ctx = ActionContext.getContext();

        Map session = ctx.getSession();

        String user = (String)session.get("jCuckoo");

        if ( user !=  null && user.equals("admin"))

        {

            return SUCCESS;

        }

        ctx.put("tip" , "您还没有登陆,或者登陆的用户名不正确,请重新登陆!");

        return LOGIN;

    }
对应的struts.xml修改成

         <action name="download" class="jCuckoo.FileDownloadAction">

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

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

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

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

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

            </result>

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

        </action>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: