歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> FtpClient中文亂碼問題解決

FtpClient中文亂碼問題解決

日期:2017/3/1 9:39:04   编辑:Linux編程

最近在做文件服務器的相關東西,在原有的磁盤存儲的基礎上,增加了Ftp的存儲方式,客戶端選用的是Apache的FtpClient。 今天在測試的時候,發現中文的路徑後者文件名不支持,查閱了相關資料後終於找到了解決的方法。

使用類:

org.apache.commons.net.ftp.FTPClient

問題描述:

創建中文目錄、上傳中文文件名時,目錄名及文件名中的中文顯示亂碼

解決方法:

在網上Google了一些資料, FTP協議裡面,規定文件名編碼為iso-8859-1,所以目錄名或文件名需要轉碼。

所以網上很多人的解決方法為:

將中文的目錄或文件名轉為iso-8859-1編碼的字符。參考代碼:

String name="目錄名或文件名";

name=new String(name.getBytes("GBK"),"iso-8859-1");

很多人改為上述操作後,發現上傳後中文不再亂碼了,就以為解決了問題

還有人處理方法為:

ftpClient.setControlEncoding("GBK");

FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);

conf.setServerLanguageCode("zh");

上述的處理方法,我都試過,發現在我自己搭建的FTP服務器上,上傳的文件中文是正常的,不是亂碼,我當時以為中文問題就解決了,但是測試部的同事在將文件上傳到他們搭建的FTP服務器上時,文件中文路徑仍然是亂碼,所以上述的解決方法是錯誤的。

上面的方法之所以錯誤的原因是因為是沒有考慮ftp服務器的編碼格式。我搭建的Ftp服務器(windows2003 server)支持GBK編碼方式,所以上述的解決方法可以,但是測試部的同事搭建的Ftp服務器(serv-u)是支持UTF-8格式的,所以此時在客戶端的編碼方式是GBK的,而搭設的ftp服務器中的設置就已經是utf-8的編碼,所以肯定還是會出現亂碼的問題。

那麼正確的解決方法時是什麼呢,我們可以仿照FlashFXP、FileZilla等ftp 客戶端連接工具,看看他們是如何實現的,下面的兩張圖就是FileZilla的配置信息和連接時的命令信息。

圖1:FileZilla配置信息

圖2:FileZilla連接時信息

從圖2中我們可以看到原來它向服務器發送了OPTS UTF8 ON命令,來開啟服務器對UTF-8的支持。所以我們也可以仿照FileZilla那樣向服務器發送該命令。如果服務器支持UTF-8我們就用UTTF-8,否則我們就用本地編碼(GBK)來處理中文文件名。

下面是Java代碼:

/** 本地字符編碼 */
private static String LOCAL_CHARSET = "GBK";

// FTP協議裡面,規定文件名編碼為iso-8859-1
private static String SERVER_CHARSET = "ISO-8859-1";

private void connectFtpServer() {
if (ftpClient == null) {
ftpClient = new FTPClient();
}
if (ftpClient.isConnected()) {
return;
}
String host = getConfigValue(ADDRESS);
int port = Integer.valueOf(getConfigValue(PORT));
String user = getConfigValue(USER);
String password = getConfigValue(PASSWORD);
try {
ftpClient.connect(host, port);
if (FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
if (ftpClient.login(user, password)) {
if (FTPReply.isPositiveCompletion(ftpClient.sendCommand(
"OPTS UTF8", "ON"))) {// 開啟服務器對UTF-8的支持,如果服務器支持就用UTF-8編碼,否則就使用本地編碼(GBK).
LOCAL_CHARSET = "UTF-8";
}
ftpClient.setControlEncoding(LOCAL_CHARSET);
ftpClient.enterLocalPassiveMode();// 設置被動模式
ftpClient.setFileType(getTransforModule());// 設置傳輸的模式
return;
} else {
throw new FileStorageException(
"Connet ftpServer error! Please check user or password");
}
}
} catch (IOException e) {
disConnectServer();
throw new FileStorageException(
"Connet ftpServer error! Please check the Configuration");
}
}
上傳文件時,文件名稱需要做編碼轉換
fileName = new String(fileName.getBytes(LOCAL_CHARSET),
SERVER_CHARSET);

通過上述方法,就能解決了中文亂碼的問題。

Copyright © Linux教程網 All Rights Reserved