Javamail 中附件中文名字亂碼祥解 (轉)

worldblog發表於2007-12-14
Javamail 中附件中文名字亂碼祥解 (轉)[@more@]現在研究的人越來越多,現在我就談談在javamail中大家都會遇到的附件中文問題,由於sun的java的中文問題,導致當附件是中文時將出現亂碼,導致異常,如何避免呢??我在學習javamail時採用如下方法首先對體進行分析,首先判斷郵件體是否有附件:
  out_content = message[i].getContent();
 if (!(out_content instanceof Multipart)){//不是複合郵件體,既是不帶附件。
  partname = new String[0];
  return partname;
  }
如果是複合郵件體,那麼就可以如下的方法取得中文名:
public  static  String  getISOFileName(Part  body){ 
  //設定一個標誌,判斷檔名從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()); 
  } 
  } 
但是有一種情況下,取得的中文檔名也是亂碼,原因有的郵件在傳送郵件時,對附件名進行了特殊的編碼,解決如上問題的方法如下:
首先:
1)用如上的方法取得中文檔名:
String filename= new String(getISOFileName(part).getBytes("ISO-8859-1"),"gb2312");
然後建立檔案,如果發生FileNotFoundException異常,說明取得的檔名是經過特殊編碼的--我們取得到的未解碼的,是亂嗎,那麼就要用javamail提供的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());
 }
}
經過如上步驟,就能徹底解決javamail附件中文名亂碼問題了。
.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-993283/,如需轉載,請註明出處,否則將追究法律責任。

相關文章