我也遇到多类似问题
linux+tomcat+jsp 没用struct,上传组件用的是,smartupload
也是上传后中文名成乱码.至今没有解决这个问题
转换编码的方法不行.网上的解决方案是改smartupload源码,重新编译(smartupload上传用的编码对中文支持有问题).但是现在找不到smartupload的源码,官网也关了.
我暂时是把网站就放在windows下使用,这样还没问题,但不是长久之际.
希望有人能解决一下,谢在先了

解决方案 »

  1.   

    我尝试过这种方法了,用上传组件没有用到的表单值传递文件名还是不行
    无论是post还是get,只要传到到上传组件的页面中文就成乱码(smartupload控件是用javabean声明的,页面编码用的UTF-8)
      

  2.   

    我觉得要解决这个问题应先弄清楚为什么中文会变成乱码.
    我开始认为是编码的问题因为书上说IE发送请求时默认的是ISO-8859-1的编码,要正确的读取用户发送的中文数据就要编码转换.有两种方法:
    1.request.setCharacterEncoding("gb2312");
    2.clientData=new String(clientData.getBytes("ISO-8859-1"),"gb2312");
    因为上传系统用户发送的中文数据(文件名)包含在表单的file值(文件绝对路径)的一部分,和通过表单的text发送中文数据的情况不一样.
    我采取的办法是在文件上传的action中,在读取文件之前用方法2,将上传的文件名(formfile.getfilename获得)转换成gb2312,然后再用流读取上传文件,写入到目标路径.但还是不行.也许要用方法1吧.欢迎大家讨论啊!
      

  3.   

    无论是用
    1.request.setCharacterEncoding("gb2312");
    还是用new String,还是同时用,都没办法解决乱码问题
    但是在没有调用上传控件的页面采用上面的方法就不存在乱码了
    说明上传控件肯定是有一定问题
    改上传控件源码的方法在网上有成功的案例,但我还没有试过。
    如果谁那儿有smartupload的源码,麻烦给一份,谢谢了
    "H a l f H o u r @ s o h u . c o m"
      

  4.   

    我看到有人问file和text一起上传的时候,有enctype="multipart/form-data"时能上传但text数据会变成乱码而没有enctype时就不能上传但是text没有乱码了!后来有人说用过滤器就解决了.由此想到我的问题可能出在enctype这里了.可以考虑将上传文件的文件名用过滤器试下.
      

  5.   

    楼上的用的什么方法做的上传啊?也是formfile吗?如果是和我一样的方法的话贴下你的源程序吧
      

  6.   

    是不是乱码环境很重要
    如果在windows下用gb2312就没有乱码
    如果在linux下使用,utf-8,就会有乱码
      

  7.   

    我为了使我的web应用国际化所有的页面都采用的uft-8的编码?如果我不去国际化而是只有中文的资源文件的话,所有页面用gb2312编码能解决这个问题吗?
      

  8.   

    在我的调试过程中,linux里的jsp页只有用uft-8编码,网页中的静态中文(即不是从数据库或是表单内读出来的中文)才不会是乱码。
      

  9.   

    smartupload是jsp上传组件要去网上下载jspsmartupload.jar包
    formfile即org.apache.struts.upload.formfile包.不过是struts自带的无须下载.
    fileupload要到网上下载commons-fileupload-1.1-dev.jar.还用到commons-io-1.1-dev.jar。
    还有个cos组件不太清楚
    以上说的对吗?
    我用struts不知选什么组件好啊!谁能比较下?
      

  10.   

    不需要啊,就用struts标准上传组件,在上传前增加个文字过滤器就可以了
    package com.sei.filter;import javax.servlet.Filter;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;
    import javax.servlet.FilterChain;
    import java.io.IOException;public class SetCharacterEncodingFilter implements Filter {  protected FilterConfig filterConfig;
      protected String encodingName;
      protected boolean enable;  public SetCharacterEncodingFilter() {
        this.encodingName = "UTF-8";
        this.enable = false;
      }  public void init(FilterConfig filterConfig) throws ServletException {
        this.filterConfig = filterConfig;
        loadConfigParams();
      }  private void loadConfigParams() {
        //encoding
        this.encodingName = this.filterConfig.getInitParameter("encoding");
        //filter enable flag...
        String strIgnoreFlag = this.filterConfig.getInitParameter("enable");
        if (strIgnoreFlag.equalsIgnoreCase("true")) {
          this.enable = true;
        } else {
          this.enable = false;
        }
      }  public void doFilter(ServletRequest request, ServletResponse response,
                           FilterChain chain) throws IOException, ServletException {
        if(this.enable) {
          request.setCharacterEncoding(this.encodingName);
        }
        chain.doFilter(request, response);
      }  public void destroy() {
      }}
    web.xml
     <filter>
        <filter-name>Set Character Encoding</filter-name>
        <filter-class>com.sei.filter.SetCharacterEncodingFilter</filter-class>
        <init-param>
          <param-name>encoding</param-name>
          <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
          <param-name>enable</param-name>
          <param-value>true</param-value>
        </init-param>
      </filter>
      <filter-mapping>
        <filter-name>Set Character Encoding</filter-name>
        <servlet-name>action</servlet-name>
      </filter-mapping>