昨天发了个贴,没人响应,只好再发。
先简单描述下问题:
1.中文名称的文件用360下载器无法下载(没试过迅雷,估计也不行),但是用web保存的方式又能够下载。
2.英文名称的文件下载一切正常。
3.在360下载器的下载栏中中文名显示正常,但是tomcat信息栏总却显示中文文件名为乱码,
 如(E:\project\1286619949453?????????.txt (系统找不到指定的文件。)])部分代码如下,请大侠看看:
Action:
//文件下载
   public InputStream getDownload()throws Exception { 
  
   return new FileInputStream(url+"\\"+file);    
 
     }
   /** 提供转换编码后的供下载用的文件名 */     public String getDownloadFileName() {     String downFileName =file;     try {     downFileName = new String(downFileName.getBytes(), "ISO8859-1");     } catch (UnsupportedEncodingException e) {     e.printStackTrace();     }     return downFileName;     } 
   public String execute() throws Exception { 
   
   //file = new String(file.getBytes("ISO8859-1"),"UTF-8");//中文下载
   return "downSuccess";     } 
}struts.xml
<action name="download" class="MessageAction"> 
           <result name="downSuccess" type="stream"> 
           <param name="contentType">application/OCTET-STREAM</param> 
           <param name="inputName">download</param> 
            <param name="contentDisposition">attachment;filename="${downloadFileName}"</param> 
            <param name="bufferSize">4096</param> 
          </result>
</action>jsp页面:
<td height="20" align="center" bgcolor="#FFFFFF">附件下载:</td>
                    <td bgcolor="#FFFFFF"><s:if test="sysAnnounce.accessoryURL!=null"></s:if>
                    <c:forTokens var="str" items="${sysAnnounce.accessoryURL}" delims=";" varStatus="status">   
                      <c:out value="${str}"/><a href="download.action?file=${str}">&nbsp;&nbsp;&nbsp;&nbsp;点击下载</a>
                      <br>
          </c:forTokens> 
          </td>      web.xml:
<!-- 解决中文字符乱码 -->
    <filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>

解决方案 »

  1.   

    中文文件名 用 url.encoding() 方法进行编码后, 就可以了
      

  2.   

    这是我写,试试吧,,
    package com.hotmail.shaiberni.filter;import javax.servlet.*;
    import java.io.IOException;
    /**
     * 用于设置 HTTP 请求字符编码的过滤器,通过过滤器参数encoding指明使用何种字符编码,用于处理Html Form请求参数的中文问题
     */public class CharacterEncodingFilter implements Filter
    {
     protected FilterConfig filterConfig = null;
     protected String encoding = "gbk";
     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException
     {
            if(encoding != null)
             servletRequest.setCharacterEncoding(encoding);
            filterChain.doFilter(servletRequest, servletResponse);
     }
     public void destroy()
     {
      filterConfig = null;
      encoding = null;
     }
        public void init(FilterConfig filterConfig) throws ServletException
     {
             this.filterConfig = filterConfig;
            this.encoding = filterConfig.getInitParameter("encoding");
     }
    }
      

  3.   

    这是配置
    <filter>
        <display-name>CharacterEncodingFilter</display-name>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>com.hotmail.shaiberni.filter.CharacterEncodingFilter</filter-class>
      </filter>
      <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>
      

  4.   

    downFileName = new String(downFileName.getBytes("GB2312"), "ISO8859-1");或者用
    downFileName = java.net.URLEncoder.encode(downFileName,"URF-8"));