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 閱讀(4839) 評論(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)

          是否有包沖突??
            回復  更多評論
            

          主站蜘蛛池模板: 容城县| 大渡口区| 修文县| 岢岚县| 贵州省| 林西县| 大渡口区| 苍溪县| 阜城县| 伊宁市| 康马县| 安化县| 宝山区| 麦盖提县| 剑河县| 天门市| 正定县| 商南县| 阿荣旗| 黄冈市| 四子王旗| 辽源市| 鄂温| 南康市| 富平县| 晋江市| 蕉岭县| 会泽县| 庆元县| 邹城市| 安岳县| 腾冲县| 榆中县| 玉屏| 和顺县| 东乡族自治县| 峡江县| 杭锦旗| 务川| 衡山县| 武汉市|