zoukankan      html  css  js  c++  java
  • Struts 2 实现文件下载功能

    用struts 2 实现文件下载功能,主要是3个部分代码的编写:

    1. Web前端传入文件名参数;

    2. 编写寻找文件并返回InputStream的Action;

    3. 在struts.xml中进行配置。

     本文将给出一个对上述二、三部分代码编写的一个例子。

    Action:

    代码

    package a.b.c;

    import java.io.InputStream;
    import java.io.FileInputStream;
    import org.apache.struts2.ServletActionContext;
    import com.opensymphony.xwork2.ActionSupport;

    public class DownloadAction extends ActionSupport {

        
    private static final long serialVersionUID = 1656950476675155655L;
        
    private String md5;
        
    private String filename;
        
    private String directory;

        @Override
        
    public String execute() throws Exception {
            
    //这里进行参数验证,保证请求的下载文件合法性
            
    // 本例对传入参数md5进行验证并将其值赋予filename
            if (md5.matches("[\\w&&[^_]]{32}?")) {
                filename 
    = md5.toLowerCase();
                
    return SUCCESS;
            }
            
    return INPUT;
        }

        
    public InputStream getInputStream() throws Exception {
            String dir 
    = directory + filename + ".txt";
            
    return new FileInputStream(dir);    //如果dir是绝对路径
    //        return ServletActionContext.getServletContext().getResourceAsStream(dir);    //如果dir是Resource下的相对路径
        }

        
    /**
         * 
    @return the md5
         
    */
        
    public String getMd5() {
            
    return md5;
        }

        
    /**
         * 
    @param md5
         *            the md5 to set
         
    */
        
    public void setMd5(String md5) {
            
    this.md5 = md5;
        }

        
    /**
         * 
    @return the filename
         
    */
        
    public String getFilename() {
            
    return filename;
        }

        
    /**
         * 
    @param filename
         *            the filename to set
         
    */
        
    public void setFilename(String filename) {
            
    this.filename = this.getMd5();
        }

        
    /**
         * 
    @param directory
         *            the directory to set
         
    */
        
    public void setDirectory(String directory) {
            
    this.directory = directory;
        }

    }

    Action中没有给出directory的get方法,其目的为保护文件路径不被访问到。

    execute()方法对传入参数进行验证,若验证成功,返回success,否则返回input。

    getInputStream()方法将返回一个InputStream,在struts.xml中,配置了一个参数inputStream,通过这个方法获得流对象。

    struts.xml:

     代码

    <action name="download" class="a.b.c.DownloadAction" >
        
    <param name="directory">D:/download/</param>
        
    <result name="success" type="stream">
            
    <!-- 指定下载文件的内容类型,text/plain是默认类型 -->
            
    <param name="contentType">text/plain</param>
            
    <!-- inputName默认值是inputStream,如果action中用于读取下载文件内容的属性名是inputStream,那么可以省略这个参数 -->
            
    <param name="inputName">inputStream</param>
            
    <!--动态获取文件名,从Action中的取得filename-->
            
    <param name="contentDisposition">
                attachment;filename="${filename}"
            
    </param>
            
    <param name="bufferSize">2048</param>
        
    </result>
        
    <result name="input">/WEB-INF/pages/inputError.jsp</result>
    </action>

     参考API SteamResult(http://struts.apache.org/2.0.14/struts2-core/apidocs/org/apache/struts2/dispatcher/StreamResult.html),其中

    contentType是内容类型,根据不同文件类型参照MIME标准设置,本例是文本。

    contentDisposition是文件下载的处理方式,包括内联(inline)和附件(attachment),默认是inline, 使用附件时这样配置:attachment;filename="文件名" 。

    若Action中验证失败,转到inputError页面。 

  • 相关阅读:
    Linux的文件权限与目录配置
    'scanf': This function or variable may be unsafe
    无法解析的外部符号 _main
    无法解析的外部符号 _WinMain@16
    Linux 基础命令和帮助命令
    Linux是什么与如何学习
    主机规划与磁盘分区
    三、git学习之——管理修改、撤销修改、删除文件
    git学习——git命令之创建版本库和版本退回
    git学习——git下载安装
  • 原文地址:https://www.cnblogs.com/noam/p/1691054.html
Copyright © 2011-2022 走看看