欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

文件下载 struts2文件下载 struts2注解

程序员文章站 2022-07-04 09:47:39
...
1、配置文件方式下载文件:

这种方式,网上有很多例子,我没有试过,我用的是注解方式。


2、注解方式下载文件:
没有上传工程,直接附上代码。
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.convention.annotation.*;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;

/**
 * 文件下载类
 *
 * @author 张国明 guomingzhang2008@gmail.com
 * @version 2012-11-29 上午10:34
 */
@ParentPackage("struts-default")
@Namespace("/test")
@ResultPath(value = "/")
@Results({
        @Result(params = {
                "contentType", "application/octet-stream",
                "inputName", "inputStream",
                "contentDisposition", "attachment;filename=\"${fileName}\"",
                "bufferSize", "4096"},
                name = "download", type = "stream")
})
public class DownloadAction extends ActionSupport {
    /**
     * 下载文档,下载问价的访问入口方法
     *
     * @return resultName
     */
    public String testDownload() {
        // 返回 @Result 注解中的 name 值
        return "download";
    }

    
    /**
     * 获取下载读入流 必须要有方法
     * 在 @Result 注解的参数 params 中, key 为 "inputName" 所对应的 value "inputStream";
     * value "inputStream" ,决定该方法名为getInputStream;
     * 如果 value 的值为 hello ,则该方法名为 getHello;
     * @return InputStream
     */
    public InputStream getInputStream() {
        String filePath = "E:\\works_eclipse\\四.jpg";
        try {
            setFileName(new String("张国明测试 图片.jpg".getBytes(), "iso8859-1") );
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
//        这种方式取到的流为null,原因不详,所以直接 new FileInputStream
//        return ServletActionContext.getServletContext().getResourceAsStream(filePath);
        try {
            return new FileInputStream(filePath);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 下载文件的名称,用于动态获取下载文件的名称(可选,即下载的文件名可以写死在@Result的params参数中,但是没有人会这么傻。)
     * 在 @Result 注解的参数 params 中通过 ${fileName} 来获取该属性 fileName 的值;
     * 和EL表达式的取值方式类似,呵呵;
     */
    private String fileName;

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }
}