struts2中文件下载以及中文乱码
昨天在试着做一个使用struts2文件下载的功能,基本上没有考虑到乱码的问题,因为当时文件都是以数字进行命名的,下载过程中没有出现问题。
下面给出代码,
Action类,
public class DocDownloadAction extends ActionSupport{
private String downPath;//下载文件的文件位置
public InputStream getInputStream(){
//返回InputStream流方法
return ServletActionContext.getServletContext().getResourceAsStream(downPath);
}
public String getDownPath() {
return downPath;
}
public void setDownPath(String downPath) {
this.downPath = downPath;
}
//文件名转换编码,防止中文乱码
public String getDownloadFileName(){
String downFileName = downPath.substring(7);
try {
downFileName = new String(downFileName.getBytes(),"UTF-8");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return downFileName;
}
@Override
public String execute() throws Exception {
return SUCCESS;
}
}
配置,
<action name="downLoad" class="com.mxl.action.DocDownloadAction">
<result type="stream"><!-- 指定结果类型为stream类型 -->
<param name="contentType"> <!-- 指定下载文件的文件类型 -->
application/msword,text/plain,application/vnd.ms-powerpoint,application/vnd.ms-excel
</param>
<param name="inputName">inputStream</param><!-- 指定下载文件的入口输入流 -->
<param name="contentDisposition">
attachment;filename="${downloadFileName}"<!-- 指定下载文件的处理方式与文件保存名 -->
</param>
<param name="bufferSize">40960</param><!-- 指定下载文件的缓冲区大小 -->
</result>
</action>
界面:
<font style="font-size:12px; color:red">上传者<s:property value="name"/></font>
<table cellpadding="0" cellspacing="0">
<tr>
<th>文件名称</th>
<th>上传时间</th>
</tr>
<s:iterator value="uploadFileName" status="st" var="doc">
<tr>
<td><a href="downLoad.action?downPath=upload/<s:property value="#doc"/>"><s:property value="#doc"/></a></td>
<td><s:date name="createTime" format="yyyy-MM-dd HH:mm:ss"/></td>
</tr>
</s:iterator>
</table>
当时测试的时候因为文件命名没有用到中文,就没有出错,
后来在练习下载权限控制的时候我发现了这个问题,刚开始代码是这样,
public InputStream getInputStream(){
//返回InputStream流方法
return ServletActionContext.getServletContext().getResourceAsStream(Path);
}
当文件命名为中文时,文件不能下载,这里边返回值为空,经过测试后发现downPath中的文件名是乱码的,在网上搜了一下好多方法,都试了试,最后在return前边加了一句,
path = new String(path.getBytes("ISO8859-1"),"utf-8");
解决了我的问题,但是修改后,文件是能够下载了,但是在浏览器中显示的文件名是乱码的,分析以后发现是这里边出的问题,未修改之前的代码,
public String getDownloadFileName(){
String downFileName = downPath.substring(7);
try {
downFileName = new String(downFileName.getBytes(),"UTF-8");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return downFileName;
}
我试着将上边的那行代码里边的编码方式交换,
downFileName = new String(downFileName.getBytes("utf-8"),"ISO8859-1");
解决了我的问题,
希望能帮到遇到同样问题的伙伴。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理