概述
解决 FTPClient下载中文路径和中文文件名乱码的方案
解决中文的乱码问题主要以下几点:
根据FTP服务器配置编码设置客户端的编码方式ftpClient.setControlEncoding();
在判断FTP上目录是否存在对目录进行编码;new String(remotePath.getBytes(), FTP.DEFAULT_CONTROL_ENCODING)
下载文件时,文件名和路径要进行编码否则下载乱码remoteFileName = new String(remoteFileName.getBytes(), FTP.DEFAULT_CONTROL_ENCODING)
总结:乱码的主要问题是客户端编码和FTP服务端编码不一致导致的,在使用ftpClien时进行编码
参考代码
maven的是这个引入代码包
commons-net
commons-net
3.3
连接FTP服务器
public void login() throws FTPUtilsException {
ftpClient = new org.apache.commons.net.ftp.FTPClient();
try {
try {
ftpClient.connect(this.ftpAddress, this.ftpPort);
} catch (Exception e ) {
throw new FTPException("连接FTP服务器“" + this.ftpAddress +"” 失败", e);
}
try {
ftpClient.login(this.ftpUsername, this.ftpPassword);
} catch (Exception e) {
throw new FTPException("登录FTP服务器“" + this.ftpAddress +"” 失败", e);
}
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
if (FTPReply.isPositiveCompletion(ftpClient.sendCommand("OPTS UTF8", "ON"))) {
// 开启服务器对UTF-8的支持,如果服务器支持就用UTF-8编码,否则就使用本地编码(GBK).
localCharset = CHARSET_UTF8;
}
ftpClient.setControlEncoding(localCharset);
//限制缓冲区大小
ftpClient.setBufferSize(BUFFER_SIZE);
int reply = ftpClient.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
closeConnect();
throw new FTPException("连接FTP服务器“" + this.ftpAddress + "”失败");
}
ftpClient.enterLocalPassiveMode(); // 设置被动模式,开通一个端口来传输数据
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
} catch (Exception e) {
closeConnect();
throw new FTPUtilsException("登录FTP服务器失败", e);
}
}
关闭FTP连接
public void closeConnect() {
if (ftpClient != null && ftpClient.isConnected()) {
try {
ftpClient.logout();
ftpClient.disconnect();
} catch (IOException e) {
ThrowableManager.process(e);
LOGGER.error(LogProperty.LOGTYPE_DETAIL,"关闭FTP连接败", e);
}
}
}
下载该目录下所有文件到本地
/**
<