`
xyzroundo
  • 浏览: 498194 次
  • 性别: Icon_minigender_1
  • 来自: 惠州
社区版块
存档分类
最新评论

struts2多文件动态下载及中文解决方案

 
阅读更多
<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>&lt;</span><span>html</span><span>&gt;</span>
</li>
<li>
<span>  </span><span>&lt;</span><span>head</span><span>&gt;</span>
</li>
<li>
<span>   </span><span>&lt;</span><span>title</span><span>&gt;</span><span>download</span><span>&lt;/</span><span>title</span><span>&gt;</span>
</li>
<li>
<span>  </span><span>&lt;/</span><span>head</span><span>&gt;</span>
</li>
<li>
<span>  </span><span>&lt;</span><span>body</span><span>&gt;</span>
</li>
<li>
<span>   </span><span>&lt;</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> &lt; </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>&lt;a href=download.action?name=</span><span>"</span><span> + </span><span>fname</span><span> + </span><span>"</span><span>&gt;</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>&lt;/a&gt;&lt;br&gt;</span><span>"</span><span>);</span>
</li>
<li><span>    }</span></li>
<li>
<span>   %</span><span>&gt;</span>
</li>
<li>
<span>  </span><span>&lt;/</span><span>body</span><span>&gt;</span>
</li>
<li>
<span> </span><span>&lt;/</span><span>html</span><span>&gt;</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>        * &lt;param &gt;attachment;filename="${fileName}"&lt;/param&gt;</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>       * &lt;param &gt;downloadFile&lt;/param&gt;</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>&lt;</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>&gt;</span>
</li>
<li>
<span>      </span><span>&lt;</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>&gt;</span>
</li>
<li>
<span>          </span><span>&lt;</span><span>param</span><span> </span><span>name</span><span>=</span><span>"</span><span>contentDisposition</span><span>"</span><span>&gt;</span><span>attachment;filename="${fileName}"</span><span>&lt;/</span><span>param</span><span>&gt;</span><span> </span>
</li>
<li>
<span>          </span><span>&lt;</span><span>param</span><span> </span><span>name</span><span>=</span><span>"</span><span>inputName</span><span>"</span><span>&gt;</span><span>downloadFile</span><span>&lt;/</span><span>param</span><span>&gt;</span>
</li>
<li>
<span>      </span><span>&lt;/</span><span>result</span><span>&gt;</span>
</li>
<li>
<span>   </span><span>&lt;/</span><span>action</span><span>&gt;</span>
</li>
</ol>
<p>web.xml:</p>
<ol>
<li>
<span>&lt;</span><span>filter</span><span>&gt;</span>
</li>
<li>
<span>    </span><span>&lt;</span><span>filter-name</span><span>&gt;</span><span>struts2</span><span>&lt;/</span><span>filter-name</span><span>&gt;</span>
</li>
<li>
<span>    </span><span>&lt;</span><span>filter-class</span><span>&gt;</span><span>org.apache.struts2.dispatcher.FilterDispatcher</span><span>&lt;/</span><span>filter-class</span><span>&gt;</span>
</li>
<li>
<span> </span><span>&lt;/</span><span>filter</span><span>&gt;</span>
</li>
<li>
<span>  </span><span>&lt;</span><span>filter-mapping</span><span>&gt;</span>
</li>
<li>
<span>    </span><span>&lt;</span><span>filter-name</span><span>&gt;</span><span>struts2</span><span>&lt;/</span><span>filter-name</span><span>&gt;</span>
</li>
<li>
<span>    </span><span>&lt;</span><span>url-pattern</span><span>&gt;</span><span>/*</span><span>&lt;/</span><span>url-pattern</span><span>&gt;</span>
</li>
<li>
<span>  </span><span>&lt;/</span><span>filter-mapping</span><span>&gt;</span>
</li>
<li><span> </span></li>
<li>
<span>  </span><span>&lt;</span><span>welcome-file-list</span><span>&gt;</span>
</li>
<li>
<span>    </span><span>&lt;</span><span>welcome-file</span><span>&gt;</span><span>download.jsp</span><span>&lt;/</span><span>welcome-file</span><span>&gt;</span>
</li>
<li>
<span>  </span><span>&lt;/</span><span>welcome-file-list</span><span>&gt;</span>
</li>
</ol>
分享到:
评论
1 楼 wangwenfei1985 2014-02-26  
   

相关推荐

    struts2实现文件下载及中文名字转换解决方案

    简单的下载文件代码,下载中文附件,下载已经存在的文件方案介绍

    Struts实现文件下载中文乱码解决方案

    Struts实现文件下载中文乱码解决方案收藏

    Bug管理系统 struts2+sping2.5+hibernate3(2-2)

    注:本程序分两部分上传,需要两个文件同时才能解压。...本程序尽量包含了开发当中遇到的一些问题及解决方案。同时欢迎广大网友到作者的群内讨论交流。 本程序适合于想学习JAVA技术或框架技术的初学者阅读。

    Jakarta+Struts+编程[扫描版][中文]

    高效的Model 2编程并不是一项简单的任务,开发人员经常自己发现难于找到很多问题的最佳解决方式。本书是Struts项目的完全指南,引导开发人员理解概念、设计和实现方式。虽然它由Struts应用程序的基础开始并深入讲解...

    Bug管理系统 struts2+sping2.5+hibernate3(1-2)

    注:本程序分两部分上传,需要两部分同时才能解压。...本程序尽量包含了开发当中遇到的一些问题及解决方案。同时欢迎广大网友到作者的群内讨论交流。 本程序适合于想学习JAVA技术或框架技术的初学者阅读。

    Struts in Action 中文版

    Struts 是Apache 软件基金下Jakarta 项目子项目。除Struts 之外, Jakarta 还有其他成功的开源 产品,包括Tomcat, Ant, ...点,但绝不会将你锁定在一个只有你们团队才懂的专有解决方案上。 开源软件对所有人都是双赢的。

    Spring攻略(第二版 中文高清版).part2

    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 解决方案...

    Spring攻略(第二版 中文高清版).part1

    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 解决方案...

    structs程序设计从入门到精通word文档

    3.3Struts-config.xml配置文件讲解 3.4struts中文问题","struts国际化问题"??终极解决方案 9 3.5为 Web 服务构建 Struts 应用程序 9 3.6Struts标记库是如何工作的 9 3.7Struts 9 3.8struts简单例子的分析(含代码...

    Struts in Action中文版

    2.3.2. Servlet 解决方案.................................................................................................44 2.3.3. Servlet 框架............................................................

    sshz中文乱码解决方法

    struts2中文乱码解决方案 1.在struts.xml文件中加入一个常量配置: &lt;struts&gt; &lt;constant name="struts.i18n.encoding" value="GBK"/&gt; &lt;/struts&gt; 2.在web.xml文件中struts的filter之前加入 &lt;filter&gt; ...

    Spring中文帮助文档

    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. ...

    SPRING2.0中文帮助文档

    Spring提供了一种轻量级的解决方案,用于建立“快装式企业应用”。在此基础上,Spring还提供了包括声明式事务管理,RMI或Web Services远程访问业务逻辑,以及可以多种方法进行的持久化数据库地解决方案。另外,...

    struts in Action

    2.3.2. Servlet 解决方案.................................................................................................44 2.3.3. Servlet 框架.............................................................

    spring3.2中文文档

    spring3.2框架是一个轻量级的解决方案和一个潜在的 一站式为构建企业级应用程序。 然而, spring是模块化的,允许你只使用那些你需要的部分, 无需引入其余。 您可以使用IoC容器, Struts在上,但是你也可以只使用 ...

    Spring2中文参考手册

    在此基础上,Spring还提供了包括声明式事务管理,RMI或Web Services远程访问业务逻辑,以及可以多种方法进行的持久化数据库地解决方案。另外,Spring还有一个全功能的 MVC框架,并能透明的把 AOP 集成到你的软件中去...

    ssh(structs,spring,hibernate)框架中的上传下载

     以上是Spring+Hibernate将文件二进制数据持久化到数据库的解决方案,而Struts通过将表单中file类型的组件映射为ActionForm中类型为org.apache.struts.upload. FormFile的属性来获取表单提交的文件数据。  工程...

    Liferay入门帮助文档(Liferay开发指南)

    Liferay 是一个完整的门户解决方案,基于J2EE的应用,使用了EJB以及JMS等技术,前台界面部分使用Struts MVC 框架,基于XML的portlet配置文件可以自由地动态扩展,使用了Web服务来支持一些远程信息的获取,使用 ...

    北京中科信软AJAX培训

    中文乱码问题及其解决方案 使用responseText处理返回的普通文本信息 实战技巧:数据校验 实战技巧:级联菜单 实战技巧:条目内容 实战技巧:级联下拉列表 使用responseXML处理返回的XML信息 实战技巧:获取元对象...

Global site tag (gtag.js) - Google Analytics