Javamail 中附件中文名字亂碼祥解 (轉)
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附件中文名亂碼問題了。
.
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- JavaMail中文附件的處理方法 (轉)JavaAI
- JavaMail 傳送附件的例子 (轉)JavaAI
- JavaMail 郵件傳送,有意思的附件名亂碼 → 客戶端正常,web端亂碼JavaAI客戶端Web
- 關於javamail亂碼?JavaAI
- ROS中解決中文亂碼ROS
- mysql 插入中文亂碼解決方案 轉MySql
- 解決plsql中中文亂碼問題SQL
- 解決Oracle11g中的索引名字亂碼問題Oracle索引
- java實現瀏覽器下載附件時檔名中文亂碼解決方案Java瀏覽器
- java中解決request中文亂碼問題Java
- footer.html中中文亂碼的解決HTML
- RHEL中文亂碼解決
- HttpClient 解決中文亂碼HTTPclient
- java的中文亂碼轉換Java
- URL地址中的中文亂碼怎麼解決?
- 解決kettle配置檔案中的中文亂碼
- request/response解決中文亂碼
- eclipse中文亂碼解決Eclipse
- myeclipse解決中文亂碼Eclipse
- 解決Linux中文亂碼Linux
- 解決中文亂碼問題
- JSP與JavaMail(5)---傳送三種型別的附件 (轉)JSJavaAI型別
- URL地址中的中文亂碼問題的解決
- 解決URL請求中的中文亂碼問題
- 使用 IntelliJ IDEA 編譯 Jmeter5.3 原始碼-基於 Gradle,解決上傳附件中文名稱亂碼與錄製指令碼中文亂碼問題IntelliJIdea編譯JMeter原始碼Gradle指令碼
- C# 解決httplistener querystring 中文亂碼、返回json中文格式亂碼C#HTTPJSON
- MySql中文亂碼問題解決MySql
- Jmeter 解決中文亂碼問題JMeter
- 解決 SecureCRT 和 SecureFX 中文亂碼Securecrt
- Java 解決中文亂碼問題Java
- RDSSQLSERVER解決中文亂碼問題SQLServer
- Windows下Clion中文亂碼解決Windows
- 徹底解決Oracle中文亂碼Oracle
- 解決MySQL中文亂碼問題MySql
- Node.js 中文亂碼解決Node.js
- 解決SecureCRT中文顯示亂碼Securecrt
- QT中文顯示亂碼解決QT
- matplotlib 圖示 中文亂碼, 與 wordcloud 詞雲圖 中文亂碼 解決方法Cloud