import com.ttfund.crm.sync.config.FtpConfig;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPFileFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
/**
* @author gukaikai
* @date 2021/8/10 15:08
* @description ftp文件上传和下载
*/
@Service
public class FtpUtils {
private static Logger logger = LoggerFactory.getLogger(FtpUtils.class);
static String todayDate = new SimpleDateFormat("yyyyMMdd").format(new Date());
private static String ftpFilePath = "crm/taxes/" + todayDate;
@Resource
private FtpConfig ftpConfig;
/**
* 上传文件到FTP服务器
*
* @param filePath 需要上传的文件路径名称
* @return
*/
public String sendFileFTP(String filePath) {
String fileName="";
// 新建 FTP连接
FTPClient ftpClient = loginFtp();
try
{
// 读取需要上传的文件
File file = new File(filePath);
FileInputStream fis = new FileInputStream(file);
// 设置上传目录(FTP文件服务器上的存放文件的目录)
if (!ftpClient.changeWorkingDirectory(ftpFilePath)){
//如果目录不存在创建目录
String[] dirs = ftpFilePath.split("/");
String tempPath = "";
for (String dir : dirs) {
if (null == dir || "".equals(dir))
continue;
tempPath = dir;
if (!ftpClient.changeWorkingDirectory(tempPath)) {
if (!ftpClient.makeDirectory(tempPath)) {
logger.error("创建目录失败");
return null;
} else {
//创建成功,切换进目录,从当前目录开始创建下层目录
ftpClient.changeWorkingDirectory(tempPath);
}
}
}
}
fileName = file.getName();
//解决中文名称乱码
fileName=new String(fileName.getBytes(), StandardCharsets.ISO_8859_1);
// 上传文件、存储文件到FTP服务器
if (ftpClient.storeFile(fileName, fis)){
logger.info("上传文件: "+filePath+" 到FTP服务器"+ftpFilePath+"目录下");
return ftpFilePath+"/"+file.getName();
}
} catch (Exception e) {
logger.error("上传文件: "+filePath+" 到FTP服务器发生异常:", e);
} finally {
try {
if (ftpClient != null) {
ftpClient.disconnect();
}
} catch (Exception e) {
logger.error("关闭FTP服务器连接发生异常:", e);
}
}
return null;
}
/**
* 本地创建文件夹
*
* @param filePath 文件夹路径
* @return
*/
public void mkdir(String filePath) {
try {
File file = new File(filePath);
if (!file.exists()) {
file.mkdir();
}
} catch (Exception e) {
logger.error("创建本地文件夹出现异常" + e);
}
}
/**
* 从FTP服务器中下载文件
* @param ftpFileName 将要下载的文件名称
* @param localFilePath 获取后的文件本地存放目录
* @return
*/
public List<String> getFileFromFTP(String ftpFileName) {
// 存放返回的文件路径
List<String> retFilePathList = new ArrayList<>();
// 新建 FTP 连接
FTPClient ftpClient = loginFtp();
try {
File file = new File(ftpFileName);
// 创建本地存放文件目录
mkdir(ftpConfig.getTaxesQueryDownFilePath());
//分割出文件名称
String fileName = ftpFileName.split("/")[ftpFileName.split("/").length-1];
String[] path = ftpFileName.split("/");
//分割出文件存储路径
String ftpFilePath="";
for (int i = 0; i < path.length-1; i++) {
ftpFilePath+=path[i]+"/";
}
//获取ftp服务器中ftpFilePath目录下名称为fileName的文件集合
FTPFile[] listFiles = ftpClient.listFiles(ftpFilePath, new FTPFileFilter() {
@Override
public boolean accept(FTPFile ftpFile) {
// 文件名
String name = ftpFile.getName();
// 获取指定文件
return Objects.equals(name,fileName ) ;
}
});
ftpClient.changeWorkingDirectory(ftpFilePath);
if (listFiles.length==0){
logger.info("文件 "+ftpFileName +" 不存在");
return null;
}
// 下载多个文件
for (FTPFile ftpFile : listFiles) {
String name = ftpFile.getName();
// 保存到本地的 文件全路径
String outFilePath = ftpConfig.getTaxesQueryDownFilePath() + File.separator + name;
logger.info("从FTP服务器下载文件:{} 到:{}", name, outFilePath);
try(
// 获取后的文件存放目录
FileOutputStream fos = new FileOutputStream(new File(outFilePath));){
// 从FTP服务器中获取 文件 到输出流
name=new String(name.getBytes(), StandardCharsets.ISO_8859_1);
ftpClient.retrieveFile(name, fos);
// 刷新输出缓冲
fos.flush();
// 把文件路径返回
retFilePathList.add(outFilePath);
//退出服务器
ftpClient.logout();
}catch (Exception e) {
logger.error("从FTP服务器中获取文件 "+ftpFileName+" 发生异常:", name, e);
}
}
}catch (Exception e) {
logger.error("从FTP服务器中获取文件 "+ftpFileName+" 发生异常:", e);
}finally {
try {
if(ftpClient != null){
ftpClient.disconnect();
}
} catch (Exception e) {
logger.error("关闭FTP服务器连接发生异常", e);
}
}
return retFilePathList ;
}
/**
* ftp服务器连接
* @return
*/
public FTPClient loginFtp(){
try {
// 新建 FTP 连接
FTPClient ftpClient = new FTPClient();
// 连接FTP服务器
ftpClient.connect(ftpConfig.getFtpServerIp(), ftpConfig.getFtpServerPort());
// 登陆FTP服务器
if (ftpClient.login(ftpConfig.getFtpUsername(), ftpConfig.getFtpPassword())){
// 设置缓存大小
ftpClient.setBufferSize(1024*1024*10);
// 设置编码
ftpClient.setControlEncoding("UTF-8");
// 设置文件格式 二进制格式
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
return ftpClient;
}
}catch (Exception e){
logger.info("连接ftp服务器出现异常:"+e);
}
return null;
}
/**
* ftp文件删除
* @param ftpFileName 要删除的文件名称
*/
public void ftpDeleteTaxes(String ftpFileName) {
// 新建 FTP 连接
FTPClient ftpClient = loginFtp();
try {
String[] path = ftpFileName.split("/");
//分割出文件存储路径
String ftpFilePath="";
for (int i = 0; i < path.length-1; i++) {
ftpFilePath+=path[i]+"/";
}
//分割出文件名称
String fileName = ftpFileName.split("/")[ftpFileName.split("/").length-1];
//获取ftp服务器中ftpFilePath目录下名称为fileName的文件集合
String finalFileName = fileName;
FTPFile[] listFiles = ftpClient.listFiles(ftpFilePath, new FTPFileFilter() {
@Override
public boolean accept(FTPFile ftpFile) {
// 文件名
String name = ftpFile.getName();
// 获取指定文件
return Objects.equals(name, finalFileName) ;
}
});
if (listFiles.length==0){
logger.info("文件 "+ftpFileName +" 不存在");
}
if (listFiles.length>0){
fileName=new String(fileName.getBytes(), StandardCharsets.ISO_8859_1);
boolean deleteFile = ftpClient.deleteFile(ftpFilePath + "/" + fileName);
if (deleteFile){
logger.info("成功删除FTP文件: " + ftpFileName);
}
}
//获取该路径下所有文件名称
// FTPFile[] ftpFiles = ftpClient.listFiles(ftpFilePath);
// for (FTPFile ftpFile : ftpFiles) {
fileName=new String(ftpFile.getName().getBytes(), StandardCharsets.ISO_8859_1);
ftpClient.dele(ftpFilePath + "/" + fileName);
// System.out.println(ftpFile.getName());
// }
}catch (Exception e){
logger.error("FTP删除文件出现异常:"+e);
}finally {
try {
if(ftpClient != null){
ftpClient.disconnect();
}
} catch (Exception e) {
logger.error("关闭FTP服务器连接发生异常", e);
}
}
}
}
ftp文件上传、下载、删除
最新推荐文章于 2024-07-14 08:31:02 发布