`
xinklabi
  • 浏览: 1591510 次
  • 性别: Icon_minigender_1
  • 来自: 吉林
文章分类
社区版块
存档分类
最新评论

struts2文件下载(使用struts2配置方式和单纯response方式)

 
阅读更多

若是使用类似Servlet方式下载,可以通过ServletActionContext帮助类或者ServletResponseAware接口获得response,然后再按照设置response的头和流的方式即可完成下载,但是Action的方法必须返回null,意思是脱离struts2的管理,必须这样做,否则将会报getOutputStream已经被调用的异常.

错误如下:

报错: java.lang.IllegalStateException: getOutputStream() has already been called for this response的错误.
Struts方法之间调用引起的。

因为:每个方法都返回的是一个ActionForward对象,而response是ActionForward对象参数,所以就会使response冲突! 故,将最后的return "SUCCESS"改为 return null .不将其交由sturts管理.

技术要点
本节代码详细说明文件下载功能的开发流程,介绍知识点如下:

上传成功页面重修改后支持文件下载代码内容。
DownloadAction文件下载功能开发。
struts.xml中DownloadAction配置,以及支持文件名为中文字符的文件下载。
下载文件流程展示。


演示代码
上传成功页面,这里笔者让其在每个上传文件后提供“下载”链接。

Java代码 复制代码 收藏代码
  1. <!------------------------文件名:result.jsp------------------->
  2. <%@taglib prefix="s" uri="/struts-tags"%>
  3. <body>
  4. 上传文件:
  5. <table>
  6. <!-- 循环显示上传成功文件名 -->
  7. <s:iterator value="fileFileName" status="fn">
  8. <tr>
  9. <td>
  10. <!-- 上传成功文件名 -->
  11. <s:property />
  12. </td>
  13. <td>
  14. <!-- 下载文件链接内容为定义的下载Action -->
  15. <!-- 下载文件名作为链接参数fileName值,用OGNL表达式表达 -->
  16. <a href="<s:url value='download.action'>
  17. <s:param name='fileName'
  18. value='fileFileName[#fn.getIndex()]'/>
  19. </s:url>">下载</a>
  20. </td>
  21. </tr>
  22. </s:iterator>
  23. </table>
  24. </body>
<!------------------------文件名:result.jsp------------------->
<%@taglib prefix="s" uri="/struts-tags"%>
	<body>
		上传文件:
		<table>
		<!-- 循环显示上传成功文件名 -->
		<s:iterator value="fileFileName" status="fn">
		<tr>
		<td>
		<!-- 上传成功文件名 -->
		<s:property />		
		</td>
		<td>
		<!-- 下载文件链接内容为定义的下载Action -->
		<!-- 下载文件名作为链接参数fileName值,用OGNL表达式表达 -->	
		<a href="<s:url value='download.action'>  				
                 	<s:param name='fileName'
 value='fileFileName[#fn.getIndex()]'/>  
                 </s:url>">下载</a>
		</td>
		</tr>
		</s:iterator>		
		</table>		
	</body>


DownLoadAction类代码

Java代码 复制代码 收藏代码
  1. <!------------文件名:DownLoadAction.java ------------------>
  2. import java.io.InputStream;
  3. import java.io.UnsupportedEncodingException;
  4. import org.apache.struts2.ServletActionContext;
  5. import com.opensymphony.xwork2.ActionSupport;
  6. public class DownLoadAction extends ActionSupport {
  7. //下载文件原始存放路径
  8. private final static String DOWNLOADFILEPATH="/upload/";
  9. //文件名参数变量
  10. private String fileName;
  11. public String getFileName() {
  12. return fileName;
  13. }
  14. public void setFileName(String fileName) {
  15. this.fileName = fileName;
  16. }
  17. //从下载文件原始存放路径读取得到文件输出流
  18. public InputStream getDownloadFile() {
  19. return
  20. ServletActionContext.getServletContext().getResourceAsStream(DOWNLOADFILEPATH+fileName);
  21. }
  22. //如果下载文件名为中文,进行字符编码转换
  23. public String getDownloadChineseFileName() {
  24. String downloadChineseFileName = fileName;
  25. try {
  26. downloadChineseFileName = new String(downloadChineseFileName.getBytes(), "ISO8859-1");
  27. } catch (UnsupportedEncodingException e) {
  28. e.printStackTrace();
  29. }
  30. return downloadChineseFileName;
  31. }
  32. public String execute() {
  33. return SUCCESS;
  34. }
  35. }
<!------------文件名:DownLoadAction.java ------------------>
import java.io.InputStream;
import java.io.UnsupportedEncodingException;

import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class DownLoadAction extends ActionSupport {
	//下载文件原始存放路径
	private final static String DOWNLOADFILEPATH="/upload/";
	//文件名参数变量
	private String fileName;

	public String getFileName() {
		return fileName;
	}

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

	//从下载文件原始存放路径读取得到文件输出流
	public InputStream getDownloadFile() {
		return 
ServletActionContext.getServletContext().getResourceAsStream(DOWNLOADFILEPATH+fileName);
	}
	//如果下载文件名为中文,进行字符编码转换
	public String getDownloadChineseFileName() {
		String downloadChineseFileName = fileName;

		try {
			downloadChineseFileName = new String(downloadChineseFileName.getBytes(), "ISO8859-1");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}

		return downloadChineseFileName;
	}

	public String execute() {
		return SUCCESS;
	}
}


struts.xml配置文件中有关文件下载的配置:

Java代码 复制代码 收藏代码
  1. <!------------------文件名:struts.xml----------------->
  2. <struts>
  3. <!-- 下载文件的Action定义 -->
  4. <action name="download" class="action.DownLoadAction">
  5. <!-- 设置文件名参数,由页面上传入 -->
  6. <param name="fileName"></param>
  7. <result name="success" type="stream">
  8. <!-- 下载文件类型定义 -->
  9. <param name="contentType">text/plain</param>
  10. <!-- 下载文件处理方法 -->
  11. <param name="contentDisposition">
  12. attachment;filename="${downloadChineseFileName}"
  13. </param>
  14. <!-- 下载文件输出流定义 -->
  15. <param name="inputName">downloadFile</param>
  16. </result>
  17. </action>
  18. </struts>
<!------------------文件名:struts.xml----------------->
<struts>
	<!-- 下载文件的Action定义 -->
		<action name="download" class="action.DownLoadAction">
			<!-- 设置文件名参数,由页面上传入 -->
			<param name="fileName"></param>
			<result name="success" type="stream">
				<!-- 下载文件类型定义 -->
				<param name="contentType">text/plain</param>
				<!-- 下载文件处理方法 -->
				<param name="contentDisposition">
					attachment;filename="${downloadChineseFileName}"
				</param>
				<!-- 下载文件输出流定义 -->
				<param name="inputName">downloadFile</param>
			</result>
		</action>
</struts> 


(1):文件开始下载页面如图4.12所示。

图4.12 文件下载
(2):单击“下载”链接,比如点“下载文件1.txt”文件右边“下载”链接,出现对话框如图4.13所示。

图4.13 下载文件处理方式
(3):单击“保存”按钮后选择下载文件存放路径,如图4.14所示。

图4.14 下载文件选择存放路径


代码解释
(1)在result.jsp中通过iterator标签和url标签定义了“fileFileName”的循环显示以及链接。其中有关“status”和OGNL表达式笔者会在之后章节里具体介绍,这里只是让读者知道是如何使用标签显示图4.12显示的内容。特别指出<param>标签为downloadAction定义了一个参数,该参数名为“fileName”,因为在4.4.1小节中笔者定义的“fileFileName”是个List类型的数据集合,因此利用OGNL表达式将文件名作为“fileName”参数值传入downloadAction中。
(2)DownLoadAction文件中先定义了常量DOWNLOADFILEPATH,它是下载文件在服务器存放的路径名,也就是4.4.1小节中上传文件在服务器存放的路径名。
定义好DOWNLOADFILEPATH后,在定义DownLoadAction的属性变量。因为在result.jsp中定义了参数“fileName”,则它作为DownLoadAction的属性变量,需要定义相应的getter、setter方法。
然后定义了getDownloadFile方法,它返回的是一个文件流,表明将被下载文件转换为输出流,方便下载。利用Struts2自带的“ServletActionContext”类的API把下载文件存放路径作为方法参数,读取下载文件,将其转换为文件流。
还有一个getDownloadChineseFileName方法,该方法主要作用是将文件名为中文字符的文件进行文件名的字符编码集合转换。因为在Web系统中由JSP等视图页面传入的变量值,特别是中文字符的变量。缺省的字符编码集合都是“ISO8859-1”,因此利用Java的字符串类的API,将字符编码转成开发需要的字符编码集。防止中文字符乱码问题发生。
(3)struts.xml中定义了名为“download”的Action。其中它自己的参数“fileName”因为在这里它的值会从JSP页面上传入,所以这里只是定义,没有具体给它赋任何值
在<result>标签中定义了type属性,值为“stream”。如果是下载文件功能开发,DownLoadAction一定要设置type属性,而且值为“stream”。这是因为在Struts2自带的xml配置文件为struts-default.xml中有关于“stream”的result返回类型的定义,代码如下:

Java代码 复制代码 收藏代码
  1. <!-------------------文件名:struts-default.xml-------------->
  2. <result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>
<!-------------------文件名:struts-default.xml-------------->
<result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>


这里Struts2定义了result返回类型为“stream”,这个result类型主要是处理文件的输入和输出流时候需要使用的。因为下载文件就是把文件转换成输入输出流,将其从一个文件路径放到另外一个文件路径中去。所以肯定要设置这个result类型的。
“contentType”、“contentDisposition”、“inputName”都是这个result的属性。“contentType”就是文件类型。这里因为下载的文件是文本文件,因此设定的值为文本文件类型,具体各个文件类型如何定义,4.4.1小节已经介绍过,这里不再做说明。“contentDisposition”是指定下载文件处理方式,如图4.13就是处理方式的效果。特别指出如果“contentDisposition”定义的值把前面的“attachment”去掉,则下载方式不是以附件方式下载,如果单击“下载”链接,则会把下载文件的内容显示在浏览器中。读者可以去试验一下。这里有个“${downloadChineseFileName}”,这就是在DownLoadAction中定义getDownloadChineseFileName方法的目的,${downloadChineseFileName}是OGNL的表达式,它显示了“downloadChineseFileName”变量的具体值,因为在DownLoadAction中定义getDownloadChineseFileName方法,则把已经转换成符合需要字符编码集的下载文件名作为下载文件方式对话框中显示的名称,不会造成任何乱码问题。“inputName”是最关键的一个属性,也是一定要定义的属性,“inputName”参数中定义的值“downloadFile”就是DownLoadAction中getDownloadFile方法返回的文件流名字。在Struts2中Acion用前缀名为get的方法得到各种属性的值,这些属性有些是在Action中定义,有些就像本示例在配置文件中利用OGNL表达式或直接定义。
(4)开始进行文件下载功能展示,按照如上记述的步骤执行即可。笔者将两个文本文件上传上去,然后在上传成功页面对具体的文件进行下载。在图4.13中单击“保存”按钮就显示图4.14,选择在本机上存放下载文件的路径即可完成下载文件功能。

分享到:
评论

相关推荐

    Struts的文件下载

    在Struts配置文件中,我们需要将这个Action与URL映射,以便用户可以通过特定的URL触发文件下载: ```xml &lt;param name="contentType"&gt;application/octet-stream &lt;param name="inputName"&gt;file ...

    struts2文件上传和下载

    4. **文件下载**: Struts2提供了一种简单的方式处理文件下载。在Action类中,你可以创建一个方法返回文件流。使用`response.setHeader()`设置HTTP响应头,如`Content-Disposition`来指定文件名,以及`Content-Type`...

    Struts2之struts2文件下载详解案例struts012

    Struts2是一个强大的Java web应用程序框架,它提供了一种组织和构建MVC(模型-视图-控制器)架构的方式。在Struts2中处理文件下载是常见的需求,比如用户请求下载服务器上的文件,如PDF、图片或其他类型的文档。本...

    struts2文件下载的参数

    本文将深入探讨“Struts2文件下载的参数”这一主题,包括如何设置和使用这些参数来实现安全、高效的文件下载服务。 首先,我们需要了解Struts2中的Action类。Action类是处理用户请求的核心,它通过配置在struts.xml...

    struts2文件上传下载

    在这个特定的项目中,我们关注的是"struts2文件上传下载"的功能,这涉及到用户通过Web界面上传文件到服务器,以及从服务器下载文件到用户的设备。 文件上传是Web应用中的常见需求,例如用户可能需要提交图片、文档...

    struts2中的文件上传和下载示例

    Struts2是一个强大的Java web框架,它为开发者提供了丰富的功能,包括文件上传和下载。在Struts2中处理文件上传和下载是常见的需求,对于构建交互式的Web应用来说至关重要。以下将详细介绍Struts2中如何实现这两个...

    struts2文件上传与下载

    在Struts2中,文件上传和下载是常见的功能需求,主要用于处理用户在Web表单中提交的文件,如图片、文档等。下面将详细介绍Struts2中文件上传和下载的实现方法。 ### 1. 文件上传 #### 1.1 配置Struts2 首先,我们...

    struts1 文件上传 文件下载

    2. **设置响应头**:在Action中,通过Servlet的`response`对象设置响应头,包括`Content-Type`(文件类型)、`Content-Disposition`(定义文件名和下载方式)等。 3. **输出文件**:使用`response.getOutputStream...

    struts2 Https 配置

    在"28_Struts2ImgCode"这个文件名中,虽然没有实际的文件内容,但我们可以推测它可能包含了与Struts2和图像验证码相关的代码示例。在HTTPS环境中,如果涉及到图片验证码,需要注意的是,验证码图片也需要通过HTTPS...

    struts2文件下载(解决了中文乱码问题)

    在标题提到的场景中,开发者可能遇到了在使用Myeclipse 6.5集成开发环境,JDK1.6和Tomcat 6.0服务器环境下,通过Struts2进行文件下载时,中文文件名显示为乱码的问题。 中文乱码是由于字符编码不一致导致的,尤其是...

    struts2 文件的上传和下载

    在Struts2中,文件的上传和下载是常见的功能需求,这对于处理用户交互和数据交换至关重要。本篇文章将深入探讨Struts2中如何实现文件的上传和下载。 首先,我们来了解文件上传的基本流程。在Struts2中,文件上传...

    struts2文件下载

    在Struts2中,文件上传和下载是常见的功能,尤其在处理用户交互和数据交换时非常有用。下面将详细介绍如何在Struts2中实现文件的上传和下载。 一、文件上传 1. **配置Struts2核心过滤器**:首先,确保在web.xml中...

    Struts2多文件上传下载实例

    在实际项目中,文件上传和下载功能是必不可少的,本实例将详细讲解如何在Struts2框架下实现单个文件及多个文件的上传与下载。 首先,我们需要在Struts2的配置文件(struts.xml)中添加相关的Action配置,以便处理文件...

    struts2使用request、response

    在Struts2中,虽然request、response和session被隐藏起来,但是提供了多种便捷的方式来获取这些对象,使得开发者可以在自定义的方法中灵活地使用它们。通过使用Struts2提供的接口、注解或ActionContext,开发者能够...

    struts2配置文件传值中文乱码

    Struts2通过拦截器(Interceptor)和配置文件实现了灵活的功能扩展,其中配置文件用于定义控制器、拦截器、结果类型等组件,是框架运行的核心。 ### 问题背景:中文乱码成因分析 在Struts2框架中,中文乱码问题...

    struts2文件下载源码

    1. **配置Action**:在Struts2的配置文件(struts.xml)中,定义一个专门处理文件下载请求的Action。这个Action通常会有一个返回值类型为“stream”的结果,指示Struts2以流的形式处理响应。 2. **Action逻辑**:在...

    Struts2实现文件的上传下载

    Struts2是一个强大的MVC(Model-View-Controller)框架,广泛应用于Java Web开发中,提供了丰富的功能,包括文件的上传和下载。在本项目中,我们关注的是如何使用Struts2来实现实时的文件交互操作,即文件的上传与...

    struts2 中文文件名文件下载

    在处理文件上传和下载时,Struts2可能会遇到一个常见的问题,即中文文件名的乱码问题。这是因为不同的系统和软件对字符编码的支持不同,尤其是涉及到网络传输时,编码的兼容性尤为重要。 在“struts2 中文文件名...

    struts与hibernate实现文件的上传与动态下载

    4. **Action配置**:在Struts2的配置文件中,需要为下载操作配置相应的Action和结果。 **三、整合Struts与Hibernate** 1. **持久化文件信息**:为了实现动态下载,可能需要将文件信息(如文件名、上传时间、描述等...

    struts2和tomcat使用

    2. **配置文件**:通常为struts.xml,用于定义Action、Result和拦截器等配置,指导Struts2如何处理请求。 3. **拦截器**:在Action调用前后执行的代码段,可以实现日志记录、权限检查、事务管理等功能。 4. **OGNL...

Global site tag (gtag.js) - Google Analytics