FTP上傳文件名稱中文亂碼問題


這個問題昨天研究了一下午,以為解決了,今天早上突然發現其實並沒有解決,所以花了一早上時間又查閱了相關資料后 現在才算徹底的解決。要注意:昨天我單純的把filename轉成new String(filename.getBytes("GBK"), "ISO-8859-1"),的確發現上傳后中文不再亂碼了,於是我以為我把這個問題解決了,但是后來發現如果ftp服務器中的設置就已經是utf-8的編碼的話還是會繼續報錯的,所以我又上網找了些資料發現有個命令可以設置ftp支持UTF-8,就是這個ftpClient.sendCommand("OPTS UTF8", "ON"),所以就試了一下然后文件名字這樣new String(filename.getBytes(LOCAL_CHARSET), SERVER_CHARSET),喏,這回亂碼問題徹底解決了,下面是代碼:

public class FTPFileUtil {
//此為FTP的配置文件信息
static Map<String, String> eip = UtilProperties.getPropretiesByKey();
//本地字符編碼
static String LOCAL_CHARSET = "GBK";

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

public static FTPClient ftpClient = null;

/***
* 初始化ftp服務器
* @author panfei
* @date 2018年7月18日
*/
public static void initFtpClient() {
ftpClient = new FTPClient();
try {
ICFLoggerUtils.info("connecting...ftp服務器:"+ eip.get("ftp.username") +":"+ eip.get("ftp.port"));
//連接ftp服務器
ftpClient.connect(eip.get("ftp.uploadpath"), Integer.valueOf(eip.get("ftp.port")));
//登錄ftp服務器
ftpClient.login(eip.get("ftp.username"), eip.get("ftp.password"));
//是否成功登錄服務器
int replyCode = ftpClient.getReplyCode();
if(!FTPReply.isPositiveCompletion(replyCode)){
ICFLoggerUtils.info("connect failed...ftp服務器:"+eip.get("ftp.username")+":"+eip.get("ftp.port"));
}
ICFLoggerUtils.info("connect success...ftp服務器:"+eip.get("ftp.username")+":"+eip.get("ftp.port"));
// 開啟服務器對UTF-8的支持,如果服務器支持就用UTF-8編碼,否則就使用本地編碼(GBK).
if (FTPReply.isPositiveCompletion(ftpClient.sendCommand("OPTS UTF8", "ON"))) {
LOCAL_CHARSET = "UTF-8";
}
ftpClient.setControlEncoding(LOCAL_CHARSET);
}catch (MalformedURLException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
}

/*****
* 上傳ftp服務器
* @param pathname FTP服務器保存目錄
* @param fis 流
* @param filename 要刪除的文件名稱
* @return
* @author panfei
* @date 2018年7月18日
*/
public static boolean createFile(String pathname, InputStream fis, String filename){
boolean flag = false;
try {
ICFLoggerUtils.info("開始上傳文件");
initFtpClient();
ftpClient.makeDirectory(pathname);
ftpClient.enterLocalPassiveMode();
ftpClient.changeWorkingDirectory(pathname);
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
flag = ftpClient.storeFile(new String(filename.getBytes(LOCAL_CHARSET),
SERVER_CHARSET), fis);
if(flag){
ICFLoggerUtils.info("文件上傳成功!");
}else{
ICFLoggerUtils.info("文件上傳不成功!");
}
fis.close();
ftpClient.logout();
} catch (Exception e1) {
ICFLoggerUtils.info("上傳文件失敗");
e1.printStackTrace();
}finally {
if(ftpClient.isConnected()){
try{
ftpClient.disconnect();
}catch(IOException e){
e.printStackTrace();
}
}
if(null != fis){
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return flag;
}

/***
* 刪除文件
* @param pathname FTP服務器保存目錄 *
* @param filename 要刪除的文件名稱 *
* @return
* @author panfei
* @date 2018年7月18日
*/
public static boolean deleteFile(String pathname, String filename){
boolean flag = false;
try {
ICFLoggerUtils.info("開始刪除文件");
initFtpClient();
ftpClient.enterLocalPassiveMode();
//切換FTP目錄
ftpClient.changeWorkingDirectory(pathname);
flag = ftpClient.deleteFile(new String(filename.getBytes(LOCAL_CHARSET),
SERVER_CHARSET));
ftpClient.logout();
if(flag){
ICFLoggerUtils.info("刪除文件成功!");
}else{
ICFLoggerUtils.info("刪除文件失敗!");
}
} catch (Exception e) {
ICFLoggerUtils.info("刪除文件失敗");
e.printStackTrace();
} finally {
if(ftpClient.isConnected()){
try{
ftpClient.disconnect();
}catch(IOException e){
e.printStackTrace();
}
}
}
return flag;
}


public static void main(String[] args) throws IOException {
//InputStream inputStream = new FileInputStream("C:/Users/icfjk888/Workspaces/ICFInterfaceSrever-3.0/src/main/webapp/download/木蘭.zip");
//createFile("tempDownload",inputStream,"木蘭.zip");
//deleteFile("tempDownload", "木蘭.zip");
}
}

原文鏈接:https://blog.csdn.net/pan_fei/article/details/81109635


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM