`

Struts2 的注解方式下载文件

 
阅读更多
package com.company.core.download.action;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.HashSet;
import java.util.Set;

import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.ServletActionContext;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import com.company.core.action.BaseAction;
import com.company.core.interceptors.LoginIgnore;
import com.opensymphony.xwork2.ModelDriven;

/**
 * 所下载文件相关的的几个属性:文件格式 contentType, 
 * 获取文件名的方法inputName,
 * 文件内容(显示的)属性contentDisposition, 
 * 限定下载文件 缓冲区的值bufferSize
 * */
@Namespace("/download")
@Action("")
@ParentPackage("cc")
@Results({ @Result(name = "success", type = "stream", params = { "contentType",
		"application/octet-stream;charset=ISO8859-1", "inputName",
		"inputStream", "contentDisposition",
		"attachment;filename=\"${fileName}\"",  "bufferSize", "4096" }) })
public class DownloadAction extends BaseAction implements ModelDriven {
    /**
     * 序列号
     */
    private static final long serialVersionUID = -8423083786146592523L;
    
    /**
     * 下载文件的参数名
     */
    private String fileName;
    
    /**
     * 文件名称
     */
    private String inputName;
    
    /**
     * TODO  
     */
    private static Set<String> allowFix=new HashSet<String>();
    static{
    	allowFix.add("pdf");
    	allowFix.add("doc");
    	allowFix.add("docx");
    	allowFix.add("xlsx");
    }
    
    /**
     * fdos
     * @param fileName todo
     * @return todo
     */
    private boolean allowedFix(String fileName){
    	String fix = fileName.substring(fileName.lastIndexOf(".")+1);
    	return allowFix.contains(fix);
    }

    public String getFileName() throws UnsupportedEncodingException {
    	//解决下载文件的中文乱码问题
    	fileName=new String(fileName.getBytes(),"ISO-8859-1"); 
		return fileName;
	}


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


	/**
     * 获得inputstream
     * @return inputStream
     * @throws Exception e
     */
    public InputStream getInputStream() throws Exception {
    	
    	String s = File.separator;
        String path = ServletActionContext.getServletContext().getRealPath("/");
        
        String filepath = path + "demo_utils"+s+"jsp"+s+"download"+s+"files"+s+fileName;
        
        return  new FileInputStream(filepath);
    }
    
    
    /* 
     * 使用struts2注解方式进行下载,
     * 其中contentType,inputName,contentDisposition,bufferSize分别代表下载文件类型、指定被下载文件的入口输入流、指定下载文件的文件名、指定下载文件时的缓冲大小
     * 其中params={key1,value1,key2,value2..},下面注解里面的inputName的value值代表getInputStream()方法(潜规则为去掉get前缀、首字母小写的字符串即为inputStream)
     * 如果想在注解里面添加字符串,或者想调用方法并获得返回值,那么需要使用\"${方法名字这里依然遵守潜规则}\"这种形式,比如在"attachment;filename=gdc.exe",可以将gdc.exe替换为\"${方法名}\"通过调用该方法获得下载文件名字
     * application/octet-stream表示可以下载任何文件
     */
    @LoginIgnore
    @Action(results = { @Result(name = "success", type = "stream", params = {
            "contentType", "application/octet-stream;charset=utf-8", "inputName",
            "inputStream", "contentDisposition", "attachment;filename=\"${fileName}\"", 
            "bufferSize", "4096" }) })
    @Override
    public String execute() throws Exception {
        if(!allowedFix(fileName)){
        	return "downloadfail";
        }
        return SUCCESS;
    }

	public Object getModel() {
		// TODO Auto-generated method stub
		return null;
	}


}

 

<a href="<%=contextPath %>/download/!execute.action?fileName=<%=java.net.URLEncoder.encode("测试文档.xlsx","utf-8") %>" target=_blank >测试文档.xlsx</a>

 

 注: tomcat  server.xml 已配置 utf-8

分享到:
评论

相关推荐

    Struts2全注解方式实现文件上传与下载

    在本资源中,我们将探讨如何利用Struts2的注解方式来实现文件的上传和下载功能,这对于任何Web应用来说都是至关重要的特性。 首先,我们来看“注解”在Struts2中的作用。Struts2允许开发者使用注解来配置Action类,...

    Struts2注解详细说明文档

    ### Struts2注解详细说明 #### 一、概述 Struts2框架是Apache软件基金会下的一个开源项目,它提供了一种构建企业级Java Web应用的解决方案。自Struts2.1版本开始,引入了一个重要的插件——Convention Plugin,该...

    struts2注解登陆

    Struts2注解登录是Java Web开发中一种简化配置的方式,它允许开发者在代码中直接定义控制器、动作和结果页面的映射,从而避免了传统方式下需要在`struts.xml`配置文件中的繁琐设置。这种做法提高了代码的可读性和可...

    Struts2 注解 Demo

    首先,Struts2的注解允许我们避免传统的XML配置,从而实现更加简洁、直观的编程方式。在`Struts2Demo`项目中,我们可以看到Action类是如何通过注解进行声明的。例如,`@Action`注解用于定义一个方法作为处理HTTP请求...

    Struts2注解开发jar

    在Struts2框架中,注解开发是一种简化配置的方式,它允许开发者在类或方法级别直接标注,以定义动作、结果、参数等信息,从而减少XML配置文件的使用。本知识点将详细介绍Struts2中的注解开发及其核心组件。 标题...

    Maven实现struts2注解

    &lt;constant name="struts.objectFactory" value="struts注解工厂类全限定名,比如:org.apache.struts2.spring.StrutsSpringObjectFactory" /&gt; &lt;package name="default" extends="struts-default"&gt; ...

    struts2利用注解annotation实现文件下载

    本文将详细介绍如何使用Struts2框架结合注解(Annotation)的方式实现文件下载功能。 #### 一、Struts2框架简介 Struts2是一个基于MVC架构的Java Web应用框架,它继承了Struts1的优点,并在此基础上进行了改进。...

    struts2文件上传下载(注解版)

    下面将详细介绍这个“struts2文件上传下载(注解版)”项目的关键知识点。 1. **注解配置**: 在传统的Struts2配置中,我们需要在struts.xml文件中手动配置Action类与结果页面的映射。然而,使用注解可以在Action...

    struts2注解详解

    ### Struts2 注解详解 #### 一、Struts2 Convention 插件介绍与使用 在 Struts2 框架的发展过程中,随着版本的更新和技术的演进,其配置方式也发生了变化。从 Struts2.1 版本开始,官方不再推荐使用 Codebehind ...

    struts2注解必须包

    在Struts2中,注解(Annotation)是开发者常用的一种元数据表示方式,它允许我们在代码中直接标注信息,简化配置文件。"struts2注解必须包"指的是Struts2提供的一系列注解,它们对于简化Struts2应用的配置和增强其...

    Struts2注解使用说明文档

    Struts2 是一个流行的Java Web框架,用于构建MVC(模型-视图-控制器)架构的应用程序。在Struts2的版本2.1之后,它引入...例如,可以使用Struts2的注解(如`@Action`,`@Result`等)来覆盖或补充Convention的默认行为。

    struts2文件上传下载源代码

    在Struts2中,文件上传和下载是常见的功能需求,特别是在处理用户交互和数据交换时。这篇博客文章提供的"struts2文件上传下载源代码"旨在帮助开发者理解和实现这些功能。 文件上传功能允许用户从他们的设备上传文件...

    Struts 2使用注解配置Action

    然而,随着Java注解的广泛应用,Struts 2也引入了注解配置的方式来简化开发过程,避免了XML配置的繁琐。 在"Struts 2使用注解配置Action"中,我们不再需要在struts.xml中为每个Action类手动添加配置。相反,我们...

    struts2注解配置Action及拦截器几种不同方式写法对应的路径指向.docx

    "Struts2 注解配置 Action 及拦截器几种不同方式写法对应的路径指向" Struts2 注解配置 Action 及拦截器是 Struts2 框架中的核心组件之一,负责处理用户请求并返回响应结果。下面,我们将通过详细的解释和示例代码...

    Struts2使用注解实现文件的上传与下载

    在处理文件上传和下载这类常见任务时,Struts2提供了一种简洁的方法,尤其是通过注解进行配置,可以实现“零XML”配置,使得开发过程更加高效。本文将深入探讨如何使用Struts2的注解来实现文件的上传与下载。 首先...

    Struts2+spring注解配置

    Struts2 提供了一种使用注解替代 XML 配置的方式,使得开发者无需编写繁琐的 struts.xml 文件,即可完成Action的配置。 **Struts2 注解配置** 1. **Action 注解** - `@Action` 用于标记一个类或方法作为 Struts2 ...

    Struts2注解配置教程

    为了解决这一问题,Struts2提供了两种简化配置的方式:一种是按照约定来自动配置,另一种是使用Java注解来替代struts.xml文件中的配置。 通过使用注解,可以将一些基础配置信息从struts.xml文件中移除,让应用不...

    struts2注解配置全面解析

    随着Struts2框架的不断更新和发展,很多开发者在尝试使用注解方式进行配置时往往会遇到不少难题。尤其是在使用Struts2.1及以上版本时,由于大部分教程和资料仍然基于早期版本(如2.0版),这使得学习者难以找到适合...

    struts2注解小实例

    通过这些注解,我们可以在不编写XML配置文件的情况下,构建完整的Struts2应用。这种方式不仅使代码更加清晰,而且更易于维护。在提供的压缩包中,你可能看到类似以上示例的代码结构,它们展示了如何在实际项目中运用...

    spring和Struts2注解文档

    在IT领域,特别是Java开发框架中,Spring和Struts2都是极为重要的技术栈,它们各自通过注解(Annotation)机制提供了强大的功能扩展性和代码简洁性。以下是对Spring和Struts2注解的深入解析和使用指南。 ### Spring...

Global site tag (gtag.js) - Google Analytics