关闭

struts2中文件下载以及中文乱码

1124人阅读 评论(1) 收藏 举报
分类:

       昨天在试着做一个使用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");

解决了我的问题,

希望能帮到遇到同样问题的伙伴。





2
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:332350次
    • 积分:7211
    • 等级:
    • 排名:第3212名
    • 原创:391篇
    • 转载:20篇
    • 译文:0篇
    • 评论:63条
    博客专栏