58 lines
2.5 KiB
Java
58 lines
2.5 KiB
Java
package cn.keking.utils;
|
|
|
|
import cn.keking.config.ConfigConstants;
|
|
import org.apache.commons.net.ftp.FTPClient;
|
|
import org.apache.commons.net.ftp.FTPReply;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.springframework.util.StringUtils;
|
|
|
|
import java.io.FileOutputStream;
|
|
import java.io.IOException;
|
|
import java.io.OutputStream;
|
|
import java.net.URL;
|
|
|
|
/**
|
|
* @auther: chenjh
|
|
* @since: 2019/6/18 14:36
|
|
*/
|
|
public class FtpUtils {
|
|
|
|
private static final Logger LOGGER = LoggerFactory.getLogger(FtpUtils.class);
|
|
|
|
public static FTPClient connect(String host, int port, String username, String password, String controlEncoding) throws IOException {
|
|
FTPClient ftpClient = new FTPClient();
|
|
ftpClient.connect(host, port);
|
|
if (!StringUtils.isEmpty(username) && !StringUtils.isEmpty(password)) {
|
|
ftpClient.login(username, password);
|
|
}
|
|
int reply = ftpClient.getReplyCode();
|
|
if (!FTPReply.isPositiveCompletion(reply)) {
|
|
ftpClient.disconnect();
|
|
}
|
|
ftpClient.setControlEncoding(controlEncoding);
|
|
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
|
|
return ftpClient;
|
|
}
|
|
|
|
public static void download(String ftpUrl, String localFilePath, String ftpUsername, String ftpPassword, String ftpControlEncoding) throws IOException {
|
|
String username = StringUtils.isEmpty(ftpUsername) ? ConfigConstants.getFtpUsername() : ftpUsername;
|
|
String password = StringUtils.isEmpty(ftpPassword) ? ConfigConstants.getFtpPassword() : ftpPassword;
|
|
String controlEncoding = StringUtils.isEmpty(ftpControlEncoding) ? ConfigConstants.getFtpControlEncoding() : ftpControlEncoding;
|
|
URL url = new URL(ftpUrl);
|
|
String host = url.getHost();
|
|
int port = (url.getPort() == -1) ? url.getDefaultPort() : url.getPort();
|
|
String remoteFilePath = url.getPath();
|
|
LOGGER.debug("FTP connection url:{}, username:{}, password:{}, controlEncoding:{}, localFilePath:{}", ftpUrl, username, password, controlEncoding, localFilePath);
|
|
FTPClient ftpClient = connect(host, port, username, password, controlEncoding);
|
|
OutputStream outputStream = new FileOutputStream(localFilePath);
|
|
ftpClient.enterLocalPassiveMode();
|
|
boolean downloadResult = ftpClient.retrieveFile(new String(remoteFilePath.getBytes(controlEncoding), "ISO-8859-1"), outputStream);
|
|
LOGGER.debug("FTP download result {}", downloadResult);
|
|
outputStream.flush();
|
|
outputStream.close();
|
|
ftpClient.logout();
|
|
ftpClient.disconnect();
|
|
}
|
|
}
|