Evan's Blog

Java, software development and others.

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  28 随笔 :: 0 文章 :: 73 评论 :: 0 Trackbacks

五一节回了老家一趟,于是就有了借口不更新自己的日志了,前几天上来看到传说一梦给我留了2条留言说用SVNWebClient上传中文文件名的文件时,会出现乱码。说老实话,当初推荐SVNWebClient和sventon时,也只当它们是纯粹的基于Web的SVN浏览工具,所以也就没有去测试这个中文上传和中文注释的问题。还好当初虽然不怎样看好SVNWebClient,但也没有将其卸载,于是就试了一把。好险,差一点就没有测出来。传说一梦也不说说清楚,是当文件名中出现奇数个中文的时候会出现乱码,而偶数个时就OK,当然,我一开始试的就刚好是类似于"中文名.txt"子类的。于是杀到SVNWebClient的网站,在其论坛上看到已经有人提了问题了,只是没人问津,这不明摆着欺负中国人嘛!NND,只有发扬开源精神,自己动手了,尽管我是不会用SVNWebClient做SVN客户端工具的,放着那么好的TortoiseSVN不用,不是自己找难受嘛。

大体关于中文乱码的问题,其实就是个编码的问题,打开SVNWebClient的源码,找到处理上传的servlet:org.polarion.svnwebclient.util.Uploader.java,不是好好的嘛,用的是Jarkata的FileUpload,也做了utf8的转码,不应该有错啊。在其转换前后加了点调试代码,发现没有什么特别的东西。不过,联想到以前用过的其它文件上传组件,往往对中文的处理没有考虑周全,正准备将其代码也下载下来研究一把,突然发现其最新的版本是1.1,而SVNWebClient使用的是1.0,心想不要其已经自动纠正了。下载新的版本,不过新版本还需要Jarkata的IO库,一并下载,然后按照其文档,改用最新的ServletFileUpload,重新编译部署。这次乱得可比较彻底了,不管偶数个还是奇数个中文都是乱码,不过,好在在转换前后加了点调试,发现文件名在没有转换前竟然是正常的,于是几次尝试后,终于将其搞定。Uploader.java最新代码如下:


import  org.apache.commons.fileupload.servlet.ServletFileUpload;
import  org.apache.commons.fileupload.disk.DiskFileItemFactory;


public   class  Uploader {

    
public   static  Map doPost(HttpServletRequest request, HttpServletResponse responce, String destinationDirectory, String tempDirectory) {
        Map parameters 
=   new  HashMap();

        File tempDir 
=   new  File(tempDirectory);
        
if  ( ! tempDir.exists()) {
            tempDir.mkdirs();
        }

        File destDir 
=   new  File(destinationDirectory);
        
if  ( ! destDir.exists()) {
            destDir.mkdirs();
        }

        ServletFileUpload fu 
=   new  ServletFileUpload( new  DiskFileItemFactory( 4096 new  java.io.File(tempDirectory)));
        List fileItems 
=   null ;
        
try  {
            fileItems 
=  fu.parseRequest(request);
        } 
catch  (FileUploadException e) {
            Logger.getInstance(Uploader.
class ).error(e, e);
        }

        
for  (Iterator i  =  fileItems.iterator(); i.hasNext();) {
            FileItem fi 
=  (FileItem) i.next();
            
if  (fi.isFormField()) {
                
try  {
                    parameters.put(fi.getFieldName(), fi.getString(
" UTF8 " ));
                } 
catch  (UnsupportedEncodingException e) {
                    Logger.getInstance(Uploader.
class ).error(e, e);
                }
            } 
else  {
                
//  filename on the client
                String fileName  =  fi.getName();
                
//  write the file
                 try  {
                    File uploadFile 
=   new  File(destinationDirectory  +   " / "   +  FileUtil.getLastPathElement(fileName));
                    fi.write(uploadFile);
                    
//  fi.delete();
                }  catch  (Exception e) {
                    Logger.getInstance(Uploader.
class ).error(e, e);
                }
                parameters.put(FormParameters.FILE_NAME, FileUtil.getLastPathElement(fileName));
            }
        }

        
return  parameters;
    }
}

另外,不懂或者不愿意去学Java的人就不要用SVNWebClient和sventon了,世界上有那么多的各种各样语言编写的开源工具,干嘛不选一个自己熟悉的呢^_^。

Uploader.java下载
Uploader.class下载

posted on 2006-05-14 20:11 Evan 阅读(4776) 评论(11)  编辑  收藏 所属分类: SE笔记

评论

# re: 关于用SVNWebClient提交中文文件名出错的问题 2006-05-16 09:38 传说一梦
  除了修改Uploader.java文件,还要不要更新FileUpload的版本到1.1呢?
  plugin.xml文件中,好像一开始就有"<library name="lib/svncommons.jar">"一行的错误。我修改了,但是又说"com.polarion.portal.tomcat.webapps"扩展点找不到,不知道什么原因。再次请教。^_^

-------------------------------------------------------------------
  上传文件名确实存在奇偶数的问题,但我不能完全确认,所以只说有时有,有时没有。
  我原来做.NET,今年换工作了,做JAVA。由于公司需要,要安装SVNWebClient,好让老板也容易使用。所以……  回复  更多评论
  

# re: 关于用SVNWebClient提交中文文件名出错的问题 2006-05-16 09:41 传说一梦
应该是用Eclipse编译吧?Tomcat项目?再再次请教。:)  回复  更多评论
  

# re: 关于用SVNWebClient提交中文文件名出错的问题 2006-05-16 09:46 传说一梦
再再再次请教:Jarkata的IO库在什么地方使用呀?  回复  更多评论
  

# re: 关于用SVNWebClient提交中文文件名出错的问题 2006-05-16 17:11 Evan
@传说一梦

1. 直接导入Eclipse工程编译即可,不要用它的maven配置;
2. 将Jarkata的FileUpload和IO库复制到其lib目录,删掉原来的1.0包,FileUpload 1.1需要用到Commons IO;
3. 或者直接下载我编译好的Uploader.class吧,将其复制到tomcat的webapps\svnwebclient\WEB-INF\classes\org\polarion\svnwebclient\util目录下,覆盖原来的程序,然后将webapps\svnwebclient\WEB-INF\lib目录下1.0的FileUpload包给删掉,将最新的FileUpload和IO库复制过来就可以了。

Good luck:)  回复  更多评论
  

# re: 关于用SVNWebClient提交中文文件名出错的问题 2006-05-27 08:49 浼犺涓€姊?Url=http://legendry.cnblogs.com
3Q!  回复  更多评论
  

# re: 关于用SVNWebClient提交中文文件名出错的问题 2006-06-22 12:47 传说一梦
我将你做的方案重新打包,以解决中文问题,地址如下:
http://legendry.cnblogs.com/archive/2006/06/17/428424.html  回复  更多评论
  

# re: 关于用SVNWebClient提交中文文件名出错的问题 2006-09-16 22:47 cuea
你好,我用的是fileupload组件做的上传。出现以下问题,,
很急,能不能抽空帮我看下是什么问题??
我用fileupload组件做上传。。
文件能够上传,只是上传之后打开目标文件后不能正常打开~
如果是excel文件,打开会说是文件收到损坏,然后打开后就没原来的格式了,文本没变,图片的话颜色会变
不知道是在哪个环节除了问题 。

因为我是网上搜过来的。。所以可能找不到这里,能不能给我发封邮件,
谢谢。cuea@163.com
代码都是标准的fileupload流程,并且有好心网友帮我在他们那试过。没问题。

所以我想请你帮个忙,谢谢。。  回复  更多评论
  

# re: 关于用SVNWebClient提交中文文件名出错的问题 2008-05-12 16:57 Joh
我按照您的方法把svnwebclient配置好了,中文文件上传和下载都没问题,但就是当文档全部是中文时会出现,页面显示是乱码问题。。。。  回复  更多评论
  

# re: 关于用SVNWebClient提交中文文件名出错的问题 2008-05-26 12:35 Evan
@Joh
好久没有用过svnwebclient了,先参考一下这里
  回复  更多评论
  

# re: 关于用SVNWebClient提交中文文件名出错的问题 2008-12-31 10:59 徐金文
请问谁将SVN Web Client 源码导入workspace中了,而且没有error。我的邮箱: xujinwen@gmail.com
来上海就请你吃饭  回复  更多评论
  

# re: 关于用SVNWebClient提交中文文件名出错的问题 2010-10-25 11:46 Ming.Sunday
hi,Evan
把你的Uploader.class下载来替换之后,上传文件时竟然提示java.lang.NoSuchMethodError: org.polarion.svnwebclient.util.Uploader.doPost
(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;Ljava/lang/String;Ljava/lang/String;)V
at org.polarion.svnwebclient.web.servlet.FileAddActionServlet.executeSVNOperation(FileAddActionServlet.java:87)
at org.polarion.svnwebclient.web.servlet.AbstractServlet.execute(AbstractServlet.java:63)
at org.polarion.svnwebclient.web.servlet.FileAddActionServlet.doPost(FileAddActionServlet.java:73)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.polarion.svnwebclient.authorization.impl.BindSessionsFilter.doFilter(BindSessionsFilter.java:48)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.polarion.svnwebclient.web.CharsetFilter.doFilter(CharsetFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:879)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
at java.lang.Thread.run(Thread.java:595)

是否有包冲突??
  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: