<p>来源:<a href="http://jianglubin1.blog.163.com/blog/static/13177713420101245426740/">http://jianglubin1.blog.163.com/blog/static/13177713420101245426740/</a></p>
<p> </p>
<p>关于文件上传的例子,网上已经有很多,所以本文就不谈文件上传,重点是文件下载及文件名为中文的时候各个浏览器出现乱码的解决方案。
</p>
<p> </p>
<p>下面是jsp文件的代码:</p>
<p> </p>
相应的DownloadAction.java的代码:<br><ol>
<li>
<span><</span><span>html</span><span>></span>
</li>
<li>
<span> </span><span><</span><span>head</span><span>></span>
</li>
<li>
<span> </span><span><</span><span>title</span><span>></span><span>download</span><span></</span><span>title</span><span>></span>
</li>
<li>
<span> </span><span></</span><span>head</span><span>></span>
</li>
<li>
<span> </span><span><</span><span>body</span><span>></span>
</li>
<li>
<span> </span><span><</span><span>%</span>
</li>
<li>
<span> //取得服务器</span><span>"</span><span>/download/file</span><span>"</span><span>目录的物理路径</span>
</li>
<li>
<span> </span><span>String</span><span> </span><span>path</span><span> = </span><span>request</span><span>.</span><span>getRealPath</span><span>(</span><span>"</span><span>/download/file</span><span>"</span><span>);</span>
</li>
<li>
<span> //取得</span><span>"</span><span>/download/file</span><span>"</span><span>目录的</span><span>file</span><span>对象</span>
</li>
<li>
<span> </span><span>File</span><span> </span><span>file</span><span> = </span><span>new</span><span> </span><span>File</span><span>(</span><span>path</span><span>);</span>
</li>
<li>
<span> //取得</span><span>file</span><span>目录下所有文件</span>
</li>
<li>
<span> </span><span>File</span><span>[] </span><span>files</span><span> = </span><span>file</span><span>.</span><span>listFiles</span><span>();</span>
</li>
<li>
</li>
<li>
<span> </span><span>for</span><span> (</span><span>int</span><span> </span><span>i</span><span> = </span><span>0</span><span>; </span><span>i</span><span> < </span><span>files</span><span>.</span><span>length</span><span>; </span><span>i</span><span>++) {</span>
</li>
<li>
</li>
<li>
<span> </span><span>String</span><span> </span><span>fname</span><span> = </span><span>files</span><span>[</span><span>i</span><span>].</span><span>getName</span><span>();</span>
</li>
<li>
</li>
<li>
<span> //对文件名进行</span><span>url</span><span>编码(</span><span>UTF-8</span><span>指明</span><span>fname</span><span>原来的编码,</span><span>UTF-8</span><span>一般由本地编码</span><span>GBK</span><span>代替)</span>
</li>
<li>
<span> </span><span>fname</span><span> = </span><span>java</span><span>.</span><span>net</span><span>.</span><span>URLEncoder</span><span>.</span><span>encode</span><span>(</span><span>fname</span><span>, </span><span>"</span><span>UTF-8</span><span>"</span><span>);</span>
</li>
<li>
</li>
<li>
<span> </span><span>out</span><span>.</span><span>println</span><span>(</span><span>"</span><span><a href=download.action?name=</span><span>"</span><span> + </span><span>fname</span><span> + </span><span>"</span><span>></span><span>"</span>
</li>
<li>
<span> + </span><span>files</span><span>[</span><span>i</span><span>].</span><span>getName</span><span>() + </span><span>"</span><span></a><br></span><span>"</span><span>);</span>
</li>
<li><span> }</span></li>
<li>
<span> %</span><span>></span>
</li>
<li>
<span> </span><span></</span><span>body</span><span>></span>
</li>
<li>
<span> </span><span></</span><span>html</span><span>></span>
</li>
</ol> <span>相应的<span lang="EN-US">DownloadAction.java</span>的代码:<span lang="EN-US"><br><br></span></span>
<p> </p>
<ol>
<li>
<span>package</span><span> </span><span>com</span><span>.</span><span>test</span><span>.</span><span>action</span><span>;</span>
</li>
<li>
</li>
<li>
<span>import</span><span> </span><span>java</span><span>.</span><span>io</span><span>.</span><span>InputStream</span><span>;</span>
</li>
<li>
<span> </span><span>import</span><span> </span><span>java</span><span>.</span><span>io</span><span>.</span><span>UnsupportedEncodingException</span><span>;</span>
</li>
<li>
<span> </span><span>import</span><span> </span><span>com</span><span>.</span><span>opensymphony</span><span>.</span><span>xwork2</span><span>.</span><span>ActionSupport</span><span>;</span>
</li>
<li>
<span> </span><span>import</span><span> </span><span>org</span><span>.</span><span>apache</span><span>.</span><span>struts2</span><span>.</span><span>ServletActionContext</span><span>;</span>
</li>
<li>
</li>
<li>
<span>public</span><span> </span><span>class</span><span> </span><span>DownloadAction</span><span> </span><span>extends</span><span> </span><span>ActionSupport</span><span> </span><span>{</span>
</li>
<li>
<span> </span><span>private</span><span> </span><span>static</span><span> </span><span>final</span><span> </span><span>long</span><span> </span><span>serialVersionUID</span><span> = </span><span>6329383258366253255</span><span>L</span><span>;</span>
</li>
<li><span> </span></li>
<li>
<span> </span><span>private</span><span> </span><span>String</span><span> </span><span>fileName</span><span>;</span>
</li>
<li><span> </span></li>
<li>
<span> </span><span>public</span><span> </span><span>void</span><span> </span><span>setFileName</span><span>(){</span>
</li>
<li>
<span> </span><span>//得到请求下载的文件名</span>
</li>
<li>
<span> </span><span>String</span><span> </span><span>fname</span><span>=</span><span>ServletActionContext</span><span>.</span><span>getRequest</span><span>()</span><span>.</span><span>getParameter</span><span>(</span><span>"</span><span>name</span><span>"</span><span>)</span><span>; </span>
</li>
<li>
<span> </span><span>try</span><span> </span><span>{</span>
</li>
<li>
<span> </span><span>/*</span>
</li>
<li><span> * 对fname参数进行UTF-8解码,注意:实际进行UTF-8解码时会使用本地编码,本机为GBK。</span></li>
<li><span> * 这里使用request.setCharacterEncoding解码无效.</span></li>
<li><span> * 只有解码了getDownloadFile()方法才能在下载目录下正确找到请求的文件</span></li>
<li>
<span> * */</span><span> </span>
</li>
<li>
<span> </span><span>fname</span><span> = </span><span>new</span><span> </span><span>String</span><span>(</span><span>fname</span><span>.</span><span>getBytes</span><span>(</span><span>"</span><span>ISO-8859-1</span><span>"</span><span>)</span><span>, </span><span>"</span><span>UTF-8</span><span>"</span><span>)</span><span>;</span>
</li>
<li>
</li>
<li>
<span> </span><span>}</span><span> </span><span>catch</span><span> </span><span>(</span><span>Exception</span><span> </span><span>e</span><span>)</span><span> </span><span>{</span>
</li>
<li>
<span> </span><span>e</span><span>.</span><span>printStackTrace</span><span>()</span><span>;</span>
</li>
<li>
<span> </span><span>}</span><span> </span>
</li>
<li>
<span> </span><span>this</span><span>.</span><span>fileName</span><span>=</span><span>fname</span><span>; </span>
</li>
<li>
<span> </span><span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>fileName</span><span>)</span><span>; </span>
</li>
<li>
<span> </span><span>}</span>
</li>
<li><span> </span></li>
<li>
<span> </span><span>/*</span>
</li>
<li>
<span> *</span><span> @getFileName</span>
</li>
<li><span> * 此方法对应的是struts.xml文件中的:</span></li>
<li><span> * <param >attachment;filename="${fileName}"</param></span></li>
<li><span> * 这个属性设置的是下载工具下载文件时显示的文件名,</span></li>
<li><span> * 要想正确的显示中文文件名,我们需要对fileName再次编码</span></li>
<li><span> * 否则中文名文件将出现乱码,或无法下载的情况</span></li>
<li><span> * */</span></li>
<li>
<span> </span><span>public</span><span> </span><span>String</span><span> </span><span>getFileName</span><span>()</span><span> </span><span>throws</span><span> </span><span>UnsupportedEncodingException</span><span> </span><span>{</span>
</li>
<li><span> </span></li>
<li>
<span> </span><span>fileName</span><span>=</span><span>new</span><span> </span><span>String</span><span>(</span><span>fileName</span><span>.</span><span>getBytes</span><span>()</span><span>,</span><span>"</span><span>ISO-8859-1</span><span>"</span><span>)</span><span>;</span>
</li>
<li><span> </span></li>
<li>
<span> </span><span>return</span><span> </span><span>fileName</span><span>;</span>
</li>
<li>
<span> </span><span>}</span>
</li>
<li>
</li>
<li>
<span> </span><span>/*</span>
</li>
<li>
<span> *</span><span> @getDownloadFile</span>
</li>
<li><span> * 此方法对应的是struts.xml文件中的:</span></li>
<li><span> * <param >downloadFile</param></span></li>
<li><span> * 返回下载文件的流,可以参看struts2的源码</span></li>
<li><span> * */</span></li>
<li>
<span> </span><span>public</span><span> </span><span>InputStream</span><span> </span><span>getDownloadFile</span><span>()</span><span> </span><span>{</span>
</li>
<li><span> </span></li>
<li>
<span> </span><span>this</span><span>.</span><span>setFileName</span><span>()</span><span>;</span>
</li>
<li>
</li>
<li>
<span> </span><span>return</span><span> </span><span>ServletActionContext</span><span>.</span><span>getServletContext</span><span>()</span><span>.</span><span>getResourceAsStream</span><span>(</span><span>"</span><span>/download/file/</span><span>"</span><span> + </span><span>fileName</span><span>)</span><span>;</span>
</li>
<li>
<span> </span><span>}</span>
</li>
<li>
</li>
<li>
<span> @</span><span>Override</span>
</li>
<li>
<span> </span><span>public</span><span> </span><span>String</span><span> </span><span>execute</span><span>()</span><span> </span><span>throws</span><span> </span><span>Exception</span><span> </span><span>{</span>
</li>
<li>
<span> </span><span>return</span><span> </span><span>SUCCESS</span><span>;</span>
</li>
<li>
<span> </span><span>}</span>
</li>
<li>
<span> </span><span>}</span>
</li>
</ol>
<p>struts.xml相应的Action配置:</p>
<ol>
<li>
<span><</span><span>action</span><span> </span><span>name</span><span>=</span><span>"</span><span>download</span><span>"</span><span> </span><span>class</span><span>=</span><span>"</span><span>com.test.action.DownloadAction</span><span>"</span><span>></span>
</li>
<li>
<span> </span><span><</span><span>result</span><span> </span><span>name</span><span>=</span><span>"</span><span>success</span><span>"</span><span> </span><span>type</span><span>=</span><span>"</span><span>stream</span><span>"</span><span>></span>
</li>
<li>
<span> </span><span><</span><span>param</span><span> </span><span>name</span><span>=</span><span>"</span><span>contentDisposition</span><span>"</span><span>></span><span>attachment;filename="${fileName}"</span><span></</span><span>param</span><span>></span><span> </span>
</li>
<li>
<span> </span><span><</span><span>param</span><span> </span><span>name</span><span>=</span><span>"</span><span>inputName</span><span>"</span><span>></span><span>downloadFile</span><span></</span><span>param</span><span>></span>
</li>
<li>
<span> </span><span></</span><span>result</span><span>></span>
</li>
<li>
<span> </span><span></</span><span>action</span><span>></span>
</li>
</ol>
<p>web.xml:</p>
<ol>
<li>
<span><</span><span>filter</span><span>></span>
</li>
<li>
<span> </span><span><</span><span>filter-name</span><span>></span><span>struts2</span><span></</span><span>filter-name</span><span>></span>
</li>
<li>
<span> </span><span><</span><span>filter-class</span><span>></span><span>org.apache.struts2.dispatcher.FilterDispatcher</span><span></</span><span>filter-class</span><span>></span>
</li>
<li>
<span> </span><span></</span><span>filter</span><span>></span>
</li>
<li>
<span> </span><span><</span><span>filter-mapping</span><span>></span>
</li>
<li>
<span> </span><span><</span><span>filter-name</span><span>></span><span>struts2</span><span></</span><span>filter-name</span><span>></span>
</li>
<li>
<span> </span><span><</span><span>url-pattern</span><span>></span><span>/*</span><span></</span><span>url-pattern</span><span>></span>
</li>
<li>
<span> </span><span></</span><span>filter-mapping</span><span>></span>
</li>
<li><span> </span></li>
<li>
<span> </span><span><</span><span>welcome-file-list</span><span>></span>
</li>
<li>
<span> </span><span><</span><span>welcome-file</span><span>></span><span>download.jsp</span><span></</span><span>welcome-file</span><span>></span>
</li>
<li>
<span> </span><span></</span><span>welcome-file-list</span><span>></span>
</li>
</ol>
分享到:
相关推荐
简单的下载文件代码,下载中文附件,下载已经存在的文件方案介绍
Struts实现文件下载中文乱码解决方案收藏
注:本程序分两部分上传,需要两个文件同时才能解压。...本程序尽量包含了开发当中遇到的一些问题及解决方案。同时欢迎广大网友到作者的群内讨论交流。 本程序适合于想学习JAVA技术或框架技术的初学者阅读。
高效的Model 2编程并不是一项简单的任务,开发人员经常自己发现难于找到很多问题的最佳解决方式。本书是Struts项目的完全指南,引导开发人员理解概念、设计和实现方式。虽然它由Struts应用程序的基础开始并深入讲解...
注:本程序分两部分上传,需要两部分同时才能解压。...本程序尽量包含了开发当中遇到的一些问题及解决方案。同时欢迎广大网友到作者的群内讨论交流。 本程序适合于想学习JAVA技术或框架技术的初学者阅读。
Struts 是Apache 软件基金下Jakarta 项目子项目。除Struts 之外, Jakarta 还有其他成功的开源 产品,包括Tomcat, Ant, ...点,但绝不会将你锁定在一个只有你们团队才懂的专有解决方案上。 开源软件对所有人都是双赢的。
11.11.2 解决方案 472 11.11.3 工作原理 472 11.12 使用GORM查询 475 11.12.1 问题 475 11.12.2 解决方案 475 11.12.3 工作原理 475 11.13 创建自定义标记 477 11.13.1 问题 477 11.13.2 解决方案...
11.11.2 解决方案 472 11.11.3 工作原理 472 11.12 使用GORM查询 475 11.12.1 问题 475 11.12.2 解决方案 475 11.12.3 工作原理 475 11.13 创建自定义标记 477 11.13.1 问题 477 11.13.2 解决方案...
3.3Struts-config.xml配置文件讲解 3.4struts中文问题","struts国际化问题"??终极解决方案 9 3.5为 Web 服务构建 Struts 应用程序 9 3.6Struts标记库是如何工作的 9 3.7Struts 9 3.8struts简单例子的分析(含代码...
2.3.2. Servlet 解决方案.................................................................................................44 2.3.3. Servlet 框架............................................................
struts2中文乱码解决方案 1.在struts.xml文件中加入一个常量配置: <struts> <constant name="struts.i18n.encoding" value="GBK"/> </struts> 2.在web.xml文件中struts的filter之前加入 <filter> ...
2.6.1. 动态语言支持 2.6.2. 增强的测试支持 2.6.3. JMX 支持 2.6.4. 将Spring 应用程序上下文部署为JCA adapter 2.6.5. 计划任务 2.6.6. 对Java 5 (Tiger) 支持 2.7. 移植到Spring 2.5 2.7.1. 改变 2.8. ...
Spring提供了一种轻量级的解决方案,用于建立“快装式企业应用”。在此基础上,Spring还提供了包括声明式事务管理,RMI或Web Services远程访问业务逻辑,以及可以多种方法进行的持久化数据库地解决方案。另外,...
2.3.2. Servlet 解决方案.................................................................................................44 2.3.3. Servlet 框架.............................................................
spring3.2框架是一个轻量级的解决方案和一个潜在的 一站式为构建企业级应用程序。 然而, spring是模块化的,允许你只使用那些你需要的部分, 无需引入其余。 您可以使用IoC容器, Struts在上,但是你也可以只使用 ...
在此基础上,Spring还提供了包括声明式事务管理,RMI或Web Services远程访问业务逻辑,以及可以多种方法进行的持久化数据库地解决方案。另外,Spring还有一个全功能的 MVC框架,并能透明的把 AOP 集成到你的软件中去...
以上是Spring+Hibernate将文件二进制数据持久化到数据库的解决方案,而Struts通过将表单中file类型的组件映射为ActionForm中类型为org.apache.struts.upload. FormFile的属性来获取表单提交的文件数据。 工程...
Liferay 是一个完整的门户解决方案,基于J2EE的应用,使用了EJB以及JMS等技术,前台界面部分使用Struts MVC 框架,基于XML的portlet配置文件可以自由地动态扩展,使用了Web服务来支持一些远程信息的获取,使用 ...
中文乱码问题及其解决方案 使用responseText处理返回的普通文本信息 实战技巧:数据校验 实战技巧:级联菜单 实战技巧:条目内容 实战技巧:级联下拉列表 使用responseXML处理返回的XML信息 实战技巧:获取元对象...