模拟登录并连接Ftp文件服务器并下载文件
1、连接ftp文件服务器
// 连接ftp文件服务器
public static FTPClient getFtp() {
String url = "10.20.1.110";//ip地址
String username = "user";//用户名
String password = "password";//密码
int port = 110;//端口号
FTPClient ftpClient = null;
try {
ftpClient = new FTPClient();
ftpClient.connect(url,port);
ftpClient.login(username, password);
if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
return null;
}
} catch (Exception e) {
logger.error("FTP错误,请正确配置", e);
throw new SpcException("FTP错误,请正确配置");
}
return ftpClient;
}
2、下载文件
// 下载ftp文件
public static void downloadFtpFile(String localhostPath) throws IOException {
FTPClient ftpClient = getFtp();
if (ftpClient == null) {
throw new SpcException("FTP连接失败!");
}
try {
// 中文支持 可以是UTF-8 需要根据文件服务器的字符集编码自己试一试
ftpClient.setControlEncoding("GBK");
// 文件类型为二进制文件
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
// ftp client告诉ftp server开通一个端口来传输数据
ftpClient.enterLocalPassiveMode();
// 进入服务器指定下载目录
String ftpPath = "SPC_HANDBOOK";
boolean isDiretory = ftpClient.changeWorkingDirectory(ftpPath);
if (!isDiretory) {
throw new SpcException("SPC_HANDBOOK文件目录不存在!");
}
//获取指定目录下面的所有文件
FTPFile[] list = ftpClient.listFiles();
String[] fileNameList = new String[list.length];
if(list.length>0){
for (int i=0;i<list.length;i++){
fileNameList[i]=list[i].getName();
}
}
// 获取文件下载后存储的地址
//String localhostPath = "C:\\Users\\Administrator\\Desktop";
File dir = new File(localhostPath);
if (!dir.exists()) {
dir.mkdirs();
}
for (FTPFile ftpFile : list) {
// 创建本地文件的输出流:声明下载后的本地路径和文件名 File.separator代表系统默认文件目录分隔符
File localFile = new File(localhostPath +
File.separatorChar +ftpFile.getName());
// 创建本地文件
if (!localFile.exists()) {
localFile.createNewFile();
}
try (OutputStream os = new FileOutputStream(localFile)) {
//处理文件乱码
String localFileName = new String(ftpFile.getName().getBytes("GBK"),
"ISO-8859-1");
ftpClient.retrieveFile(localFileName, os);
} catch (Exception e) {
logger.info("文件下载失败:"+ftpFile.getName());
}
}
} catch (Exception e) {
logger.error("异常", e);
} finally {
ftpClient.logout();
ftpClient.disconnect();
}
}
3、编写Controller postman进行测试
//打印日志使用
private static final Logger logger = LoggerFactory.getLogger(OperationManualDownloadController.class);
@ApiOperation(value = "操作手册下载Api")
@PostMapping("/download")
public String download(){
try {
//获取当前桌面地址 使文件都下载到桌面
FileSystemView fsv = FileSystemView.getFileSystemView();
String localhostPath = String.valueOf(fsv.getHomeDirectory());
logger.info("操作手册下载开始,文件存储地址为:"+localhostPath);
downloadFtpFile(localhostPath);
} catch (IOException e) {
logger.info("下载操作手册错误!");
e.printStackTrace();
}
logger.info("文件下载结束");
return "下载成功";
}