風行天下

          JAVA太極
          posts - 4, comments - 10, trackbacks - 0, articles - 55
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          Javamail 中附件中文名字亂碼祥解

          Posted on 2005-04-19 14:39 風太少 閱讀(372) 評論(0)  編輯  收藏
          現(xiàn)在研究javamail的人越來越多,現(xiàn)在我就談?wù)勗趈avamail中大家都會遇到的附件中文問題,由于sun的java的中文問題,導致當附件是中文時將出現(xiàn)亂碼,導致程序異常,如何避免呢??我在學習javamail時采用如下方法首先對郵件體進行分析,首先判斷郵件體是否有附件:
           Object out_content = messag[i].getContent();
           if (!(out_content instanceof Multipart)){//不是復合郵件體,既是不帶附件。
                        partname = new String[0];
                        return partname;
                     }

          如果是復合郵件體,那么就可以調(diào)用如下的方法取得中文文件名:
          public  static  String  getISOFileName(Part  body){  
                         //設(shè)置一個標志,判斷文件名從Content-Disposition中獲取還是從Content-Type中獲取  
                        
           boolean  flag=true;  
                         if(body==null){  
                                 return  null;  
                         }  
                         String[]  cdis;  
                         try{  
                                 cdis=body.getHeader("Content-Disposition");  
                         }  
                         catch(Exception  e){  
                                 return  null;  
                         }  
                         if(cdis==null){  
                                 flag=false;  
                         }  
                         if(!flag){  
                                 try{  
                                         cdis=body.getHeader("Content-Type");  
                                 }  
                                 catch(Exception  e){  
                                         return  null;  
                                 }  
                         }  
                         if(cdis==null){  
                                 return  null;  
                         }  
                         if(cdis[0]==null){  
                                 return  null;  
                         }  
                         //從Content-Disposition中獲取文件名  
                         if(flag){  
                                 int  pos=cdis[0].indexOf("filename=");  
                                 if(pos<0){  
                                         return  null;  
                                 }  
                                 //如果文件名帶引號  
                                 if(cdis[0].charAt(cdis[0].length()-1)=='"'){  
                                         return  cdis[0].substring(pos+10,cdis[0].length()-1);  
                                 }  
                                 return  cdis[0].substring(pos+9,cdis[0].length());  
                         }else{  
                                 int  pos=cdis[0].indexOf("name=");  
                                 if(pos<0){  
                                         return  null;  
                                 }  
                                 //如果文件名帶引號  
                                 if(cdis[0].charAt(cdis[0].length()-1)=='"'){  
                                         return  cdis[0].substring(pos+6,cdis[0].length()-1);  
                                 }  
                                 return  cdis[0].substring(pos+5,cdis[0].length());  
                         }  
                 }  

          但是有一種情況下,取得的中文文件名也是亂碼,原因有的郵件服務(wù)器在發(fā)送郵件時,對附件名進行了特殊的編碼,解決如上問題的方法如下:
          首先:
          1)用如上的方法取得中文文件名:
          String filename= new String(getISOFileName(part).getBytes("ISO-8859-1"),"gb2312");
          然后創(chuàng)建文件,如果發(fā)生FileNotFoundException異常,說明取得的文件名是經(jīng)過特殊編碼的--我們?nèi)〉玫降奈唇獯a的,是亂嗎,那么就要用javamail提供的函數(shù)decodeText進行解碼。具體方法如下。
          try{
                  myFileoutputstream= new FileOutputStream(filename);
              }catch(FileNotFoundException fe){
                  try{
                        if (filepath.exists()){
                           filename = new File(filepath,MimeUtility.decodeText(getISOFileName(part)));
             }catch(Exception e){
              System.out.println("getpart(int i)重新生成文件:"+e.toString());
              }
             }catch(Exception e){
              System.out.println("getpart(int i)重新生成文件:"+e.toString());
              }
          }


          經(jīng)過如上步驟,就能徹底解決javamail附件中文名亂碼問題了。
          祝你好運,如果還有任何疑問,歡迎切磋,我的郵件:



          bill-轉(zhuǎn)自:csdn




          參與論壇討論:http://www.matrix.org.cn/forum.asp
          更多技術(shù)文章:http://www.matrix.org.cn/article.asp
          Matrix java門戶:http://www.matrix.org.cn
          原文地址:http://www.matrix.org.cn/article/1427.html
          任何獲得許可轉(zhuǎn)載此文章,須在顯著位置標明Matrix的原文地址,并做鏈接至原文頁面,查看詳細的版權(quán)說明

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 瓦房店市| 郑州市| 红原县| 博野县| 肥西县| 施甸县| 新竹县| 绍兴市| 东阳市| 闽侯县| 鄄城县| 九江市| 太湖县| 溆浦县| 望城县| 安义县| 深泽县| 乌兰察布市| 湟源县| 临江市| 民乐县| 靖州| 定边县| 江永县| 泰州市| 临泽县| 沂水县| 颍上县| 康定县| 临汾市| 英山县| 杂多县| 宿州市| 鹤峰县| 遂溪县| 岗巴县| 清水县| 同德县| 福泉市| 米泉市| 色达县|