Evan's Blog

          Java, software development and others.

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            28 隨筆 :: 0 文章 :: 73 評論 :: 0 Trackbacks

          五一節(jié)回了老家一趟,于是就有了借口不更新自己的日志了,前幾天上來看到傳說一夢給我留了2條留言說用SVNWebClient上傳中文文件名的文件時,會出現(xiàn)亂碼。說老實話,當(dāng)初推薦SVNWebClient和sventon時,也只當(dāng)它們是純粹的基于Web的SVN瀏覽工具,所以也就沒有去測試這個中文上傳和中文注釋的問題。還好當(dāng)初雖然不怎樣看好SVNWebClient,但也沒有將其卸載,于是就試了一把。好險,差一點就沒有測出來。傳說一夢也不說說清楚,是當(dāng)文件名中出現(xiàn)奇數(shù)個中文的時候會出現(xiàn)亂碼,而偶數(shù)個時就OK,當(dāng)然,我一開始試的就剛好是類似于"中文名.txt"子類的。于是殺到SVNWebClient的網(wǎng)站,在其論壇上看到已經(jīng)有人提了問題了,只是沒人問津,這不明擺著欺負(fù)中國人嘛!NND,只有發(fā)揚開源精神,自己動手了,盡管我是不會用SVNWebClient做SVN客戶端工具的,放著那么好的TortoiseSVN不用,不是自己找難受嘛。

          大體關(guān)于中文亂碼的問題,其實就是個編碼的問題,打開SVNWebClient的源碼,找到處理上傳的servlet:org.polarion.svnwebclient.util.Uploader.java,不是好好的嘛,用的是Jarkata的FileUpload,也做了utf8的轉(zhuǎn)碼,不應(yīng)該有錯啊。在其轉(zhuǎn)換前后加了點調(diào)試代碼,發(fā)現(xiàn)沒有什么特別的東西。不過,聯(lián)想到以前用過的其它文件上傳組件,往往對中文的處理沒有考慮周全,正準(zhǔn)備將其代碼也下載下來研究一把,突然發(fā)現(xiàn)其最新的版本是1.1,而SVNWebClient使用的是1.0,心想不要其已經(jīng)自動糾正了。下載新的版本,不過新版本還需要Jarkata的IO庫,一并下載,然后按照其文檔,改用最新的ServletFileUpload,重新編譯部署。這次亂得可比較徹底了,不管偶數(shù)個還是奇數(shù)個中文都是亂碼,不過,好在在轉(zhuǎn)換前后加了點調(diào)試,發(fā)現(xiàn)文件名在沒有轉(zhuǎn)換前竟然是正常的,于是幾次嘗試后,終于將其搞定。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;
          ????}
          }

          另外,不懂或者不愿意去學(xué)Java的人就不要用SVNWebClient和sventon了,世界上有那么多的各種各樣語言編寫的開源工具,干嘛不選一個自己熟悉的呢^_^。

          Uploader.java下載
          Uploader.class下載

          posted on 2006-05-14 20:11 Evan 閱讀(4858) 評論(11)  編輯  收藏 所屬分類: SE筆記

          評論

          # re: 關(guān)于用SVNWebClient提交中文文件名出錯的問題 2006-05-16 09:38 傳說一夢
            除了修改Uploader.java文件,還要不要更新FileUpload的版本到1.1呢?
            plugin.xml文件中,好像一開始就有"<library name="lib/svncommons.jar">"一行的錯誤。我修改了,但是又說"com.polarion.portal.tomcat.webapps"擴展點找不到,不知道什么原因。再次請教。^_^

          -------------------------------------------------------------------
            上傳文件名確實存在奇偶數(shù)的問題,但我不能完全確認(rèn),所以只說有時有,有時沒有。
            我原來做.NET,今年換工作了,做JAVA。由于公司需要,要安裝SVNWebClient,好讓老板也容易使用。所以……  回復(fù)  更多評論
            

          # re: 關(guān)于用SVNWebClient提交中文文件名出錯的問題 2006-05-16 09:41 傳說一夢
          應(yīng)該是用Eclipse編譯吧?Tomcat項目?再再次請教。:)  回復(fù)  更多評論
            

          # re: 關(guān)于用SVNWebClient提交中文文件名出錯的問題 2006-05-16 09:46 傳說一夢
          再再再次請教:Jarkata的IO庫在什么地方使用呀?  回復(fù)  更多評論
            

          # re: 關(guān)于用SVNWebClient提交中文文件名出錯的問題 2006-05-16 17:11 Evan
          @傳說一夢

          1. 直接導(dǎo)入Eclipse工程編譯即可,不要用它的maven配置;
          2. 將Jarkata的FileUpload和IO庫復(fù)制到其lib目錄,刪掉原來的1.0包,F(xiàn)ileUpload 1.1需要用到Commons IO;
          3. 或者直接下載我編譯好的Uploader.class吧,將其復(fù)制到tomcat的webapps\svnwebclient\WEB-INF\classes\org\polarion\svnwebclient\util目錄下,覆蓋原來的程序,然后將webapps\svnwebclient\WEB-INF\lib目錄下1.0的FileUpload包給刪掉,將最新的FileUpload和IO庫復(fù)制過來就可以了。

          Good luck:)  回復(fù)  更多評論
            

          # re: 關(guān)于用SVNWebClient提交中文文件名出錯的問題 2006-05-27 08:49 浼犺涓€姊?Url=http://legendry.cnblogs.com
          3Q!  回復(fù)  更多評論
            

          # re: 關(guān)于用SVNWebClient提交中文文件名出錯的問題 2006-06-22 12:47 傳說一夢
          我將你做的方案重新打包,以解決中文問題,地址如下:
          http://legendry.cnblogs.com/archive/2006/06/17/428424.html  回復(fù)  更多評論
            

          # re: 關(guān)于用SVNWebClient提交中文文件名出錯的問題 2006-09-16 22:47 cuea
          你好,我用的是fileupload組件做的上傳。出現(xiàn)以下問題,,
          很急,能不能抽空幫我看下是什么問題??
          我用fileupload組件做上傳。。
          文件能夠上傳,只是上傳之后打開目標(biāo)文件后不能正常打開~
          如果是excel文件,打開會說是文件收到損壞,然后打開后就沒原來的格式了,文本沒變,圖片的話顏色會變
          不知道是在哪個環(huán)節(jié)除了問題 。

          因為我是網(wǎng)上搜過來的。。所以可能找不到這里,能不能給我發(fā)封郵件,
          謝謝。cuea@163.com
          代碼都是標(biāo)準(zhǔn)的fileupload流程,并且有好心網(wǎng)友幫我在他們那試過。沒問題。

          所以我想請你幫個忙,謝謝。。  回復(fù)  更多評論
            

          # re: 關(guān)于用SVNWebClient提交中文文件名出錯的問題 2008-05-12 16:57 Joh
          我按照您的方法把svnwebclient配置好了,中文文件上傳和下載都沒問題,但就是當(dāng)文檔全部是中文時會出現(xiàn),頁面顯示是亂碼問題。。。。  回復(fù)  更多評論
            

          # re: 關(guān)于用SVNWebClient提交中文文件名出錯的問題 2008-05-26 12:35 Evan
          @Joh
          好久沒有用過svnwebclient了,先參考一下這里
            回復(fù)  更多評論
            

          # re: 關(guān)于用SVNWebClient提交中文文件名出錯的問題 2008-12-31 10:59 徐金文
          請問誰將SVN Web Client 源碼導(dǎo)入workspace中了,而且沒有error。我的郵箱: xujinwen@gmail.com
          來上海就請你吃飯  回復(fù)  更多評論
            

          # re: 關(guān)于用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)

          是否有包沖突??
            回復(fù)  更多評論
            

          主站蜘蛛池模板: 桂阳县| 剑阁县| 蒙阴县| 临澧县| 灯塔市| 元氏县| 晋江市| 大邑县| 钟山县| 普兰县| 曲靖市| 古浪县| 息烽县| 十堰市| 娄底市| 漯河市| 苏州市| 调兵山市| 镇沅| 潼南县| 泰宁县| 临洮县| 崇州市| 宝应县| 都兰县| 庐江县| 墨江| 濮阳县| 昌平区| 阆中市| 石林| 侯马市| 饶河县| 连州市| 柞水县| 黔南| 唐山市| 永清县| 睢宁县| 阿拉善左旗| 南丰县|