日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

關(guān)于用SVNWebClient提交中文文件名出錯(cuò)的問(wèn)題...

 ekylin 2006-08-09

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

大體關(guān)于中文亂碼的問(wèn)題,其實(shí)就是個(gè)編碼的問(wèn)題,打開(kāi)SVNWebClient的源碼,找到處理上傳的servlet:org.polarion.svnwebclient.util.Uploader.java,不是好好的嘛,用的是Jarkata的FileUpload,也做了utf8的轉(zhuǎn)碼,不應(yīng)該有錯(cuò)啊。在其轉(zhuǎn)換前后加了點(diǎn)調(diào)試代碼,發(fā)現(xiàn)沒(méi)有什么特別的東西。不過(guò),聯(lián)想到以前用過(guò)的其它文件上傳組件,往往對(duì)中文的處理沒(méi)有考慮周全,正準(zhǔn)備將其代碼也下載下來(lái)研究一把,突然發(fā)現(xiàn)其最新的版本是1.1,而SVNWebClient使用的是1.0,心想不要其已經(jīng)自動(dòng)糾正了。下載新的版本,不過(guò)新版本還需要Jarkata的IO庫(kù),一并下載,然后按照其文檔,改用最新的ServletFileUpload,重新編譯部署。這次亂得可比較徹底了,不管偶數(shù)個(gè)還是奇數(shù)個(gè)中文都是亂碼,不過(guò),好在在轉(zhuǎn)換前后加了點(diǎn)調(diào)試,發(fā)現(xiàn)文件名在沒(méi)有轉(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了,世界上有那么多的各種各樣語(yǔ)言編寫(xiě)的開(kāi)源工具,干嘛不選一個(gè)自己熟悉的呢^_^。

Uploader.java下載
Uploader.class下載

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多