关于文件上传的例子,网上已经有很多,所以本文就不谈文件上传,重点是文件下载及文件名为中文的时候各个浏览器出现乱码的解决方案。
下面是jsp文件的代码:
-
<html>
-
<head>
-
<title>download</title>
-
</head>
-
<body>
-
<%
-
//取得服务器"/download/file"目录的物理路径
-
String path = request.getRealPath("/download/file");
-
//取得"/download/file"目录的file对象
-
File file = new File(path);
-
//取得file目录下所有文件
-
File[] files = file.listFiles();
-
for (int i = 0; i < files.length; i++)
-
{
-
String fname = files[i].getName();
-
//对文件名进行url编码(UTF-8指明fname原来的编码,UTF-8一般由本地编码GBK代替)
-
fname = java.net.URLEncoder.encode(fname, "UTF-8");
-
out.println("<a href=download.action?name=" + fname + ">"
-
+ files[i].getName() + "</a><br>");
-
}
-
%>
-
</body>
-
</html>
相应的DownloadAction.java的代码:
-
package com.test.action;
-
import java.io.InputStream;
-
import java.io.UnsupportedEncodingException;
-
import com.opensymphony.xwork2.ActionSupport;
-
import org.apache.struts2.ServletActionContext;
-
public class DownloadAction extends ActionSupport {
-
private static final long serialVersionUID = 6329383258366253255L;
-
-
private String fileName;
-
-
public void setFileName(){
-
//得到请求下载的文件名
-
String fname=ServletActionContext.getRequest().getParameter("name");
-
try {
-
/*
-
* 对fname参数进行UTF-8解码,注意:实际进行UTF-8解码时会使用本地编码,本机为GBK。
-
* 这里使用request.setCharacterEncoding解码无效.
-
* 只有解码了getDownloadFile()方法才能在下载目录下正确找到请求的文件
-
* */
-
fname = new String(fname.getBytes("ISO-8859-1"), "UTF-8");
-
}
-
catch (Exception e)
-
{
-
e.printStackTrace();
-
}
-
this.fileName=fname;
-
System.out.println(fileName);
-
}
-
-
/*
-
* @getFileName
-
* 此方法对应的是struts.xml文件中的:
-
* <param name="contentDisposition">attachment;filename="${fileName}"</param>
-
* 这个属性设置的是下载工具下载文件时显示的文件名,
-
* 要想正确的显示中文文件名,我们需要对fileName再次编码
-
* 否则中文名文件将出现乱码,或无法下载的情况
-
* */
-
public String getFileName() throws UnsupportedEncodingException
-
{
-
-
fileName=new String(fileName.getBytes(),"ISO-8859-1");
-
-
return fileName;
-
}
-
/*
-
* @getDownloadFile
-
* 此方法对应的是struts.xml文件中的:
-
* <param name="inputName">downloadFile</param>
-
* 返回下载文件的流,可以参看struts2的源码
-
* */
-
public InputStream getDownloadFile() {
-
-
this.setFileName();
-
return ServletActionContext.getServletContext().getResourceAsStream("/download/file/" + fileName);
-
}
-
@Override
-
public String execute() throws Exception {
-
return SUCCESS;
-
}
-
}
struts.xml相应的Action配置:
-
<action name="download" class="com.test.action.DownloadAction">
-
<result name="success" type="stream">
-
<param name="contentDisposition">attachment;filename="${fileName}"</param>
-
<param name="inputName">downloadFile</param>
-
</result>
-
</action>
web.xml:
-
<filter>
-
<filter-name>struts2</filter-name>
-
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
-
</filter>
-
<filter-mapping>
-
<filter-name>struts2</filter-name>
-
<url-pattern>/*</url-pattern>
-
</filter-mapping>
-
-
<welcome-file-list>
-
<welcome-file>download.jsp</welcome-file>
-
</welcome-file-list>
本文的源代码在IE8.0Bate1、firefox3.0RC1、Opera下均测试通过,能够正常下载及正确显示中文文件名。
相对于文件上传来说,下载要相对简单的多,但是如何让浏览器下载窗口显示中文名却是一件头痛的事,我曾在execute方法里加上这样一段代码:
ServletActionContext.getResponse().setHeader("Cont ent-Disposition","attachment; filename="+ new String(this.getFileName().getBytes("GBK"),"ISO-8859-1"));
这是由于比较固执的想法和观念没有改变造成的,总想着我要去设置setHeader,告诉浏览器这是一个下载文件并把文件名经过相应的编码给它,让它能正确显示。事实证明这样做会带来一件让人沮丧的事,就是不管你怎么设它,在firefox和Opera里面中文文件名它都是乱码,好不容易把它转成中文显示了,却发现文件的后缀名最后有一个英文的逗号,也就是说,用户在下载了相应的文件后要自己手动去改后缀名,才能正常使用这个文件,可想而知,这是不现实的。我曾想过去判断用户所使用的浏览器,如果不是IE的话,我就把最后那个逗号给截了。可谁知道要是换了别的应行环境它出现的是不是还是逗号,而且这个逗号是怎么来的,为什么是逗号,我一无所知,要是在别的环境下它出现的不是逗号,我是不是要去重新改代码,这更是一件不现实的事。还好最后我没这样做,要是这样做了,那真是傻得没药救了!
事实上struts2中很多功能都为我们封装得很好了,只要我们给它属性注入相应的值,程序就能正常的跑起来。文件的下载也不例外,我们找到这样一个类StreamResult,文件的下载由这个类全部为我们完成。其中有一个非常重要的属性contentDisposition,这个属性决定了下载窗口中显示的文件名,不用我们像上面一样去手动设置response的setHeader,我们只要给这个属性注入正确的值,一切就OK。
而这个值需要去struts.xml文件里相应的action里去配置,由于是动态决定下载的文件,这里使用了EL表达式,${fileName},而fileName对应的则是DownloadAction里的getFileName()方法,只要在这里给fileName相应的编码,struts2会自动寻找这个方法,并把相应的值注入到xml文件中,这样浏览器的下载窗口中就能正常显示我们想要的中文名。
分享到:
相关推荐
在本文中,我们将深入探讨如何使用Struts2框架实现文件下载功能,尤其是处理包含中文名字的附件。Struts2是一个流行的Java Web开发框架,它提供了丰富的功能,包括处理HTTP请求、表单提交以及数据绑定等。对于文件...
从给定的文件信息来看,标题“struts2中文学习文档”和描述“struts2的根本webwork2”表明这是一份关于Struts2框架的学习资料,特别强调了Struts2与WebWork2的关系。Struts2是Apache Struts的一个版本,它是一个用于...
在处理文件下载时,Struts2提供了一套完整的解决方案,包括处理中文文件名的乱码问题。在标题提到的场景中,开发者可能遇到了在使用Myeclipse 6.5集成开发环境,JDK1.6和Tomcat 6.0服务器环境下,通过Struts2进行...
在“struts2 中文文件名文件下载”的场景中,我们需要关注的是如何在Struts2框架下正确处理包含中文字符的文件名。首先,我们要理解文件名编码ISO8859-1,这是一个西欧字符编码标准,不支持中文字符。在处理中文...
一种可行的解决方案是在Tomcat服务器的配置文件`server.xml`中,修改`<Connector>`标签,添加`URIEncoding="UTF-8"`属性。这将强制服务器解析URL时使用UTF-8编码,从而解决GET请求的中文乱码问题。 4. **Tomcat配置...
Struts是Apache软件基金会旗下Jakarta项目的一个核心框架,它是一个用于构建企业级Java Web应用程序的开放源代码解决方案。这个“Struts中文文档”包含了关于Struts框架的详细信息,旨在帮助开发者理解和掌握该框架...
这个问题在早期的互联网资源中被广泛讨论,但并非所有解决方案都能适用于所有情况。下面我们将深入探讨这个问题,并提供一种经过验证的有效方法。 首先,我们需要理解乱码问题的根源。在Java中,默认的字符编码通常...
以下是对这个问题的详细分析及解决方案: 首先,问题出现在文件列表的展示和下载链接的生成过程中。在Action中,`request.getRealPath()` 获取了服务器上文件的物理路径,然后遍历目录,将文件名添加到ArrayList中...
通过上述两种解决方案,我们可以有效解决Struts2资源文件在JSP页面中显示乱码的问题。虽然第一种方法可以达到目的,但其带来的维护不便使其不被推荐;相比之下,安装PropertiesEditor插件不仅操作简便,还能彻底解决...
本文将围绕“Struts2配置文件传值中文乱码”这一主题,深入探讨其成因、解决方案以及相关的配置细节,旨在帮助开发者有效解决中文乱码问题,提升用户体验。 ### Struts2框架简介 Struts2是Apache组织下的一个开源...
这份文档不仅覆盖了基础概念,还深入到了实际开发中可能遇到的问题和解决方案,对于学习和提升Struts2开发技能非常有帮助。无论是初学者还是经验丰富的开发者,都应该充分利用这份资源,以提升项目开发的效率和质量...
对于中文文件名的下载,Struts2提供了灵活的解决方案。我们可以通过在`contentDisposition`中使用`${downloadFileName}`变量,并在对应的Action类中定义`getDownloadFileName()`方法来返回经过编码的文件名。 例如...
### Struts中文问题与国际化问题——终极解决方案深度解析 #### 引言 在Web应用开发中,特别是使用Struts框架时,中文显示和国际化(Internationalization,简称i18n)问题是开发者常遇的挑战。本文将深入探讨解决...
三、请求参数中的中文乱码问题解决方案: 对于用户提交的含有汉字的请求数据导致的乱码,可以通过自定义 RequestProcessor 来解决。首先,创建一个新的类 `SelfRequestProcessor` 继承自 Struts 内置的 `...
Struts2是Java Web开发中的一个强大框架,它在MVC(Model-View-Controller)设计模式的基础上,为开发者提供了一种高效、灵活且可扩展的解决方案。本篇文档将深入探讨Struts2的核心概念、架构以及实际应用,旨在帮助...
总之,Struts2提供了一套完整的解决方案来构建Java Web应用,其丰富的标签库简化了页面的开发,而强大的拦截器机制使得业务逻辑和控制流程的管理更为灵活。通过深入理解和实践,开发者可以有效地提高开发效率,构建...
本文将详细介绍如何彻底解决Struts2中的乱码问题,并提供实际可行的解决方案。 #### 二、乱码产生的原因 在Struts2框架中,中文乱码主要由以下几个方面的原因造成: 1. **请求编码问题**:客户端发送请求时未指定...
在`myStruts`这个压缩包中,可能包含了示例代码、配置文件或测试用例,这些内容可以作为实践上述解决方案的参考。如果你在应用上述步骤后仍然遇到问题,可能需要检查`myStruts`中的具体文件以找出问题所在。例如,...
SSH(Spring、Struts2、Hibernate)是Java开发中的经典组合,它结合了Spring的依赖注入、事务管理,Hibernate的对象关系映射,以及Struts2的MVC框架,提供了一站式的解决方案。这种整合使得开发更加高效,降低了代码...