`
ducklsl
  • 浏览: 24800 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

Struts2实现文件的下载

阅读更多
如果对于实现文件的下载有了基础的认识,那么就可以知道文件的下载其实就是HTTP请求头的控制,可以直接使用Servlet实现,也可以使用Struts2框架实现。相较于Servlet需要在代码中设置相应的参数,而Struts2框架提供的下载只需要做一些相应的配置,显得相对简单。具体步骤如下:
1.搭建简单的Struts2项目(参考Struts2的Example)
2.书写文件列表显示的Action类(ListFileAction)
public class ListFileAction implements ServletRequestAware, ServletContextAware {
	private HttpServletRequest request;
	private ServletContext application;
	private List<String> listNames = new ArrayList<String>();// 可以下载的文件名集合
	public String execute() {
		getFiles();
		return "success";
	}
	public void getFiles() {
		// 指定文件上传目录就是文件下载的目录
		String pathname = ServletActionContext.getServletContext().getRealPath(
				"/upload");
		File filedir = new File(pathname);// 新建文件
		if (filedir.exists() && filedir.isDirectory()) {// 判断是否为目录,是则遍历文件
			File[] files = filedir.listFiles();
			for (File file : files) {
				listNames.add(file.getName());// 将文件名放入集合中
			}
		}
		request.setAttribute("names", listNames);// 将文件名集合放入request作用域中
	}
	@Override
	public void setServletContext(ServletContext context) {
		this.application = context;
	}
	@Override
	public void setServletRequest(HttpServletRequest request) {
		this.request = request;
	}
}
把文件列表放入request作用域中,所以在此Action中实现了ServletRequestAware, ServletContextAware这两个接口,使用依赖注入的方式获得request,也可以使用以下两种方式直接操作:
ActionContextActionContext.getContext().put("names", listNames);
ServletActionContext.getRequest().setAttribute("names", listNames);
以上两种方式都可以将names放到request的作用域中
3.显示文件名列表界面(list2.jsp)
<%
		List<String> fileNames = (List<String>) request.getAttribute("names");
			for (String name : fileNames) {
		%>
		<a href="download.action?filename=<%=name%>"><%=name%></a><br/>
		<%}%>
获取到ListFileAction放到request作用域的names的值,然后遍历出来,使用超链接的形式实现文件下载的请求
3.文件下载处理类(DownloadFileAction)
public class DownloadFileAction implements ServletRequestAware,
		ServletContextAware {
	private HttpServletRequest request;
	private ServletContext application;

	public InputStream getDownloadFile() {
		String fileName = "";
		try {
			fileName = new String(request.getParameter("filename").getBytes(
					"ISO-8859-1"), "GB2312");// 获取文件名,并且进行转码,防止乱码
			System.out.println(fileName);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return ServletActionContext.getServletContext().getResourceAsStream(
				"/upload/" + fileName);
	}
	public String execute() {
		return "success";
	}
	@Override
	public void setServletRequest(HttpServletRequest request) {
		this.request = request;
	}
	@Override
	public void setServletContext(ServletContext context) {
		this.application = context;
	}
}
在下载处理类中获取到文件名后拼接到下载路径实现对某个文件的下载。
4.配置文件的实现(struts.xml)
<!-- 文件下载action -->
		<action name="download" class="changluo.file.DownloadFileAction">
			<!-- 必须设置type为stream类型 -->
			<result name="success" type="stream">
				<param name="contentType"></param>
				<!-- 设置http请求头并且设置attachment属性以附件的方式打开,
				 如果没有设置此属性,则以inputStream的方式直接在浏览器打开;
				 并且filename设置下载时,文件显示的名称 -->
				<param name="contentDisposition">
					attachment;filename="dddd.txt"
				</param>
				<!-- inputName的属性设置要依据action中的public InputStream getDownloadFile();
				方法类设定,就是此方法名get后面的部分-->
				<param name="inputName">downloadFile</param>
			</result>
		</action>
		<!-- 显示文件列表 -->
		<action name="listFile" class="changluo.file.ListFileAction">
			<result name="success">/list2.jsp</result>
			<result name="input">/index.jsp</result>
		</action>
以上就构成了Struts2文件下载的基本组成部分。
分析:
1.在struts2中实现文件下载Action的返回值使用的是stream,这点可以从Struts2的文档中就可以看出:
Stream Result      Used to stream an InputStream back to the browser (usually for file downloads)
2.通过查看struts2.x的核心jar包中的struts-default.xml文件中,发现其中有一个名为stream的文件下载拦截器
<result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>
翻开这个类,就可以发现定义了四个变量:
...
protected String contentType="text/plain";//文件内容类型
protected String contentLength;//长度
protected String contentDisposition="inline";//默认方式为inline
protected String inputName="inputStream"; //inputStream的名称
protected String inputStream inputStream; //输入流,用于读取文件
protected int bufferSize=1024;//设置缓冲区大小
...

透过此类不难发现,其实Struts2实现文件下载的本质与普通Servlet是一致的,只是Struts2通过拦截器和配置文件进行工作。在下载Action的方法中有个固定的写法就是:
public InputStream getDownloadFile(){
    //....
    //编写返回InputStream的方法,可以直接用FileInputStream读取文件,也可以用其他方式
}
这个方法只要求返回要下载的文件的InputStream即可。所以,我也可以这样实现
public InputStream getDownloadFile() {
		String fileName = "";
		String pathName = ServletActionContext.getServletContext().getRealPath("/upload");
		String fullName = "";
		InputStream in =null;
		try {
			fileName = new String(request.getParameter("filename").getBytes(
					"ISO-8859-1"), "GB2312");// 获取文件名,并且进行转码,防止乱码
			System.out.println(fileName);
			System.out.println(pathName);
			fullName=pathName+"\\"+fileName;//完整的文件名
			System.out.println(fullName);
			in =new  FileInputStream(fullName);
		} catch (Exception e) {
			e.printStackTrace();
		}
//		return ServletActionContext.getServletContext().getResourceAsStream(
//				"/upload/" + fileName);
		return in;
	}
其实这个InputStream就如同使用Servlet实现下载时,获取到的InputStream,它是就是用来读取要下载的文件的,按照此逻辑应该有OutputStream才对,似乎没有发现。翻看StreamResult类,发现它的doExecute(...)方法,就可以发现此方法都是对HTTP请求头content-Disposition以及response.getOutputStream的操作(翻翻源码对自己是有好处滴~)
至此可以看见Struts2框架实现文件下载其实原理和Servlet文件下载的方式是一致的,也就完全理解了Struts2实现文件下载为什么要配置相应的参数了
附上关于配置文件中参数的解释,免得以后自己忘记:

contentType - the stream mime-type as sent to the web browser (default = text/plain).

contentLength - the stream length in bytes (the browser displays a progress bar).

contentDisposition - the content disposition header value for specifing the file name (default = inline, values are typically attachment;filename="document.pdf".

inputName - the name of the InputStream property from the chained action (default = inputStream).

bufferSize - the size of the buffer to copy from input to output (default = 1024).

allowCaching - if set to 'false' it will set the headers 'Pragma' and 'Cache-Control' to 'no-cahce', and prevent client from caching the content. (default = true)

contentCharSet - if set to a string, ';charset=value' will be added to the content-type header, where value is the string set. If set to an expression, the result of evaluating the expression will be used. If not set, then no charset will be set on the header
分享到:
评论

相关推荐

    struts2实现文件下载功能

    在这个“Struts2实现文件下载功能”的示例中,我们将深入探讨如何利用Struts2框架来实现在web应用中让用户下载文件的功能。 首先,我们需要理解文件下载的基本原理。在Web应用中,当用户点击一个链接或提交一个表单...

    struts2实现文件下载

    ### Struts2实现文件下载:深入解析与代码实践 #### 引言 在Web应用开发中,文件的上传与下载是常见的功能需求。Struts2框架提供了强大的支持,使得开发者能够轻松实现这些功能。本文将重点介绍Struts2中文件下载...

    Struts2实现文件下载

    在Struts2中实现文件下载是一项常见的需求,例如用户请求查看或保存服务器上的文件。下面将详细解释如何在Struts2框架下实现文件下载的功能。 首先,理解基本原理:文件下载通常涉及两个主要步骤。第一步是服务器端...

    struts2实现文件下载实例源代码

    在Struts2中实现文件下载的功能,可以帮助用户从服务器获取并保存文件到本地计算机,例如这里的"1.xls"文件。下面我们将深入探讨如何在Struts2框架下实现文件下载的实例。 首先,我们需要在项目的Web应用目录结构中...

    struts2实现文件上传下载

    本篇文章将详细探讨如何在Struts2框架下实现文件的上传与下载。 首先,我们需要了解Struts2中的文件上传机制。Struts2提供了`FileUploadInterceptor`拦截器来处理文件上传请求。在处理文件上传时,开发者需要在...

    Struts2实现文件的上传下载

    在本项目中,我们关注的是如何使用Struts2来实现实时的文件交互操作,即文件的上传与下载。 文件上传在Web应用中很常见,例如用户提交表单时可能需要附加文件,如简历、图片或文档等。Struts2提供了一套完整的机制...

    struts2实现多文件上传下载

    网上的Struts2进行的文件下载一般都是单文件或者固定的文件,并没有(很少)实现随意文件的下载的例子 提供多文件上传,上传成功后,提供刚上传的文件下载功能(其他的都可以在其上面进行扩充) 多文件 上传 下载...

    struts2文件上传下载源代码

    描述中的链接指向了CSDN博主johnjobs的一篇文章,这篇文章详细解释了如何在Struts2中实现文件上传。博主可能讨论了以下关键点: 1. **配置Struts2 Action**:在`struts.xml`配置文件中,你需要定义一个Action,该...

    struts2帮助文档

    struts2中实现文件上传 struts2中实现CRUD struts2中的OGNL struts2的新表单标志的使用 struts2与AJAX一 struts2与AJAX二 struts2与AJAX三 struts2中用Spring实现IOC struts2中的零配置与IOC struts2介绍之使用连接...

    Struts2+Jquery+Ajax

    Struts2作为Controller层,通过Action类来实现业务逻辑,并通过配置文件或注解来定义Action与URL的映射关系。 Jquery是一个高效的JavaScript库,简化了HTML文档遍历、事件处理、动画以及Ajax交互。它使得开发者能更...

    struts实现的文件上传下载功能

    总结起来,使用Struts实现文件上传下载涉及前端表单设计、后端处理逻辑、文件存储策略以及安全控制等多个方面。在实践中,我们还需要考虑到性能优化和用户体验提升,例如使用异步上传、进度条展示等技术。

    Struts2接口文档

    这个“Struts2接口文档”是开发者的重要参考资料,提供了关于Struts2框架内各个组件、类库以及接口的详细说明,帮助开发者深入理解框架的内部工作原理并有效地使用其功能。 Struts2的核心组件包括Action、Result、...

    struts2中文学习文档

    从给定的文件信息来看,标题“struts2中文学习文档”和描述“struts2的根本webwork2”表明这是一份关于Struts2框架的学习资料,特别强调了Struts2与WebWork2的关系。Struts2是Apache Struts的一个版本,它是一个用于...

    Struts的文件下载

    在Struts中实现文件下载是一项常见的功能,尤其在处理用户请求获取服务器上的静态或动态资源时。这篇博文将深入探讨如何在Struts框架下实现文件下载的功能。 首先,我们需要了解文件下载的基本原理。当用户点击下载...

    Struts2文件上传和下载教程

    Struts2提供了内置的支持来实现文件下载,通过配置`&lt;result&gt;`元素的类型为`stream`来指定下载行为。 ```xml &lt;param name="contentType"&gt;application/octet-stream &lt;param name="inputName"&gt;byteArray ...

    Struts2文件流方式导出下载excel、Txt、image图片

    通过上述步骤,我们就可以在Struts2框架下实现文件流方式的下载功能,无论是Excel、TXT还是图片,都能有效地直接返回给浏览器,让客户端进行下载。这种方式既节省了服务器资源,也提高了用户体验。在实际项目中,...

    eclipse下利用struts2实现文件的上传和下载

    在Eclipse环境中,使用Struts2框架实现文件的上传和下载是常见的Web开发任务。Struts2是一个强大的MVC框架,提供了丰富的功能来处理用户请求和响应,包括文件操作。以下是一个详细的步骤和知识点解析: 1. **Struts...

    struts1和struts2分别实现文件上传下载功能

    Struts1和Struts2是两个非常著名的Java Web框架,它们都提供了处理文件上传和下载的功能,但实现方式有所不同。本文将深入探讨这两个框架在文件操作方面的具体实现。 首先,让我们了解一下Struts1中的文件上传功能...

    struts2文件下载

    在这个示例中,我们将深入探讨如何通过Struts2实现文件下载功能。 首先,我们来看一下文件下载的基本流程。当用户点击下载链接时,浏览器会向服务器发送一个新的请求,这个请求的目标是特定的Action,即`...

Global site tag (gtag.js) - Google Analytics