FtpClient在創(chuàng)建中文目錄文件名中的中文顯示亂碼解決方法

最近在做文件服務(wù)器的相關(guān)東西,在原有的磁盤存儲的基礎(chǔ)上,增加了Ftp的存儲方式,客戶端選用的是Apache的FtpClient。 今天在測試的時候,發(fā)現(xiàn)中文的路徑后者文件名不支持,查閱了相關(guān)資料后終于找到了解決的方法。
使用類:
org.apache.commons.net.ftp.FTPClient
問題描述:
創(chuàng)建中文目錄、上傳中文文件名時,目錄名及文件名中的中文顯示亂碼解決方法:
在網(wǎng)上Google了一些資料, FTP協(xié)議里面,規(guī)定文件名編碼為iso-8859-1,所以目錄名或文件名需要轉(zhuǎn)碼。
所以網(wǎng)上很多人的解決方法為:
將中文的目錄或文件名轉(zhuǎn)為iso-8859-1編碼的字符。參考代碼:
String name="目錄名或文件名";
name=new String(name.getBytes("GBK"),"iso-8859-1");很多人改為上述操作后,發(fā)現(xiàn)上傳后中文不再亂碼了,就以為解決了問題還有人處理方法為:
ftpClient.setControlEncoding("GBK");
FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);conf.setServerLanguageCode("zh");
上述的處理方法,我都試過,發(fā)現(xiàn)在我自己搭建的FTP服務(wù)器上,上傳的文件中文是正常的,不是亂碼,我當時以為中文問題就解決了,但是測試部的同事在將文件上傳到他們搭建的FTP服務(wù)器上時,文件中文路徑仍然是亂碼,所以上述的解決方法是錯誤的。
上面的方法之所以錯誤的原因是因為是沒有考慮ftp服務(wù)器的編碼格式。我搭建的Ftp服務(wù)器(windows2003 server)支持GBK編碼方式,所以上述的解決方法可以,但是測試部的同事搭建的Ftp服務(wù)器(serv-u)是支持UTF-8格式的,所以此時在客戶端的編碼方式是GBK的,而搭設(shè)的ftp服務(wù)器中的設(shè)置就已經(jīng)是utf-8的編碼,所以肯定還是會出現(xiàn)亂碼的問題。
那么正確的解決方法時是什么呢,我們可以仿照FlashFXP、FileZilla等ftp 客戶端連接工具,看看他們是如何實現(xiàn)的,下面的兩張圖就是FileZilla的配置信息和連接時的命令信息。
圖1:FileZilla配置信息
圖2:FileZilla連接時信息
從圖2中我們可以看到原來它向服務(wù)器發(fā)送了OPTS UTF8 ON命令,來開啟服務(wù)器對UTF-8的支持。所以我們也可以仿照FileZilla那樣向服務(wù)器發(fā)送該命令。如果服務(wù)器支持UTF-8我們就用UTTF-8,否則我們就用本地編碼(GBK)來處理中文文件名。
下面是Java代碼:
/** 本地字符編碼 */
private static String LOCAL_CHARSET = "GBK";// FTP協(xié)議里面,規(guī)定文件名編碼為iso-8859-1private 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"))) {// 開啟服務(wù)器對UTF-8的支持,如果服務(wù)器支持就用UTF-8編碼,否則就使用本地編碼(GBK).
LOCAL_CHARSET = "UTF-8";
}
ftpClient.setControlEncoding(LOCAL_CHARSET);ftpClient.enterLocalPassiveMode();// 設(shè)置被動模式ftpClient.setFileType(getTransforModule());// 設(shè)置傳輸?shù)哪J絩eturn;
} 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");}
}
上傳文件時,文件名稱需要做編碼轉(zhuǎn)換
fileName = new String(fileName.getBytes(LOCAL_CHARSET),SERVER_CHARSET);
通過上述方法,就能解決了中文亂碼的問題。謝謝閱讀,希望能幫到大家,請繼續(xù)關(guān)注腳本之家,我們會努力分享更多優(yōu)秀的文章。
相關(guān)文章
Fedora Linux 42 穩(wěn)定版發(fā)布: 帶來大量新功能和軟件更新
Fedora 42昨日發(fā)布,這是 Red Hat 贊助開發(fā)的杰出前沿 Linux 發(fā)行版的最新版,包含大量新功能和軟件更新,使其成為 2025 年上半年發(fā)布的一款出色的 Linux 操作系統(tǒng)之一,內(nèi)2025-04-16如何在Linux查看硬盤信息? 查看Linux硬盤大小類型和硬件信息的5種方法
使用Linux系統(tǒng)的過程中,查看和了解硬盤信息是非常重要的工作,尤其是對于系統(tǒng)管理員而言,那么在Linux系統(tǒng)中如何查看硬盤信息?以下是具體內(nèi)容介紹2025-03-12如何在 Linux 中查看 CPU 詳細信息? 3招輕松查看CPU型號、核心數(shù)和溫度
在日常運維工作中,獲取 CPU 信息是系統(tǒng)運維管理員常見的工作內(nèi)容,無論是為了性能調(diào)優(yōu)、硬件升級還是僅僅滿足好奇心2025-03-11什么是 Arch Linux? 獨樹一幟的Arch Linux發(fā)行版分析
Arch Linux是為簡化,優(yōu)化,現(xiàn)代化,實用主義,用戶中心和多功能性而創(chuàng)建Linux發(fā)行版,究竟是什么讓 Arch 與眾不同?下面我們就來簡要解讀2025-02-19如何在Linux環(huán)境下制作 Win11裝機U盤?
一直用的linux辦公,想要將筆記本電腦從 Linux 系統(tǒng)切換回 Windows 11,我們可以制作一個win11裝機u盤,詳細如下2025-02-17Rsnapshot怎么用? 基于Rsync的強大Linux備份工具使用指南
Rsnapshot 不僅可以備份本地文件,還能通過 SSH 備份遠程文件,接下來詳細介紹如何安裝、配置和使用 Rsnapshot,包括創(chuàng)建每小時、每天、每周和每月的本地備份,以及如何進2025-02-06Linux Kernel 6.13發(fā)布:附更新內(nèi)容及新特性解讀
Linux 內(nèi)核 6.13 正式發(fā)布,新版本引入了惰性搶占支持,簡化內(nèi)核搶占邏輯,通過減少與調(diào)度器相關(guān)的調(diào)用次數(shù),讓內(nèi)核在運行時表現(xiàn)更優(yōu),從而提高效率2025-01-23五大特性引領(lǐng)創(chuàng)新! 深度操作系統(tǒng) deepin 25 Preview預(yù)覽版發(fā)布
今日,深度操作系統(tǒng)正式推出deepin 25 Preview版本,該版本集成了五大核心特性:磐石系統(tǒng)、全新DDE、Treeland窗口合成器、AI For OS以及Distrobox子系統(tǒng)2025-01-18Linux Mint Xia 22.1重磅發(fā)布: 重要更新一覽
Beta 版 Linux Mint“Xia” 22.1 發(fā)布,新版本基于 Ubuntu 24.04,內(nèi)核版本為 Linux 6.8,這次更新帶來了諸多優(yōu)化和改進,進一步鞏固了 Mint 在 Linux 桌面操作系統(tǒng)領(lǐng)域的2025-01-16LinuxMint怎么安裝? Linux Mint22下載安裝圖文教程
Linux Mint22發(fā)布以后,有很多新功能,很多朋友想要下載并安裝,該怎么操作呢?下面我們就來看看詳細安裝指南2025-01-16