package com.whyc.service; import com.whyc.dto.FTPClientUtil; import com.whyc.dto.FileDirPath; import com.whyc.dto.ZipUtils; import com.whyc.util.ActionUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.Arrays; import java.util.Date; import java.util.List; @ConditionalOnProperty(prefix = "configFile",name = "type",havingValue = "2") @Service @EnableScheduling // 2.开启定时任务 @Slf4j public class FtpService2 { //定时上传指定目录下文件,每周五凌晨开启备份 @Scheduled(cron = "59 59 23 ? * FRI") public void sendFtpFile() throws IOException { //先连接ftp服务器 FTPClient client = FTPClientUtil.connect(); String fileDirName = FileDirPath.getFileDirName(); String rootDoc=fileDirName+File.separator+"doc_file"; String timeStr= ActionUtil.sdfwithFTP.format(new Date()); client.makeDirectory(timeStr); client.disconnect(); //备份过程是否出现过问题,标识符 boolean isError=false; try { File docFile = new File(rootDoc); File[] fileList = docFile.listFiles(); //File[] fileList2 = new File[fileList.length]; //BeanUtils.copyProperties(fileList2,fileList); for (File file:fileList) { //压缩传输 File fileZip = new File(file.getAbsolutePath() + ".zip"); ZipUtils.toZip(file.getAbsolutePath(),new FileOutputStream(fileZip),true); //System.out.println(fileZip.toString()+"压缩完毕"); //System.out.println("进行FTP传输中..."); try { //ZipUtils.toZip(file.getAbsolutePath(),new FileOutputStream(fileZip),true); String pathName=timeStr+"/"+file.getName()+".zip"; //System.out.println("传输目标路径确认为:"+pathName); FTPClientUtil.transferFile(fileZip, pathName); //System.out.println(fileZip+"传输完毕"); fileZip.delete(); //System.out.println(fileZip+"传输中转压缩包删除完毕"); } catch (Exception e) { isError = true; log.error("---------------文件"+ file.getName() +" FTP 传输异常2:"+e.toString()+"------------------"); fileZip.delete(); } } //System.out.println("传输完毕"); //获取备份目录,保留4次. //如果过程出现错误,则不删除 if (!isError) { FTPClient client2 = FTPClientUtil.connect(); String[] dirList = client2.listNames(); List dirList2 = Arrays.asList(dirList); for (int i = 0; i < dirList2.size()-4; i++) { String dirToBeDelete = dirList2.get(i); if(!client2.removeDirectory(dirToBeDelete)){ // 删除失败,可以尝试递归删除目录内的所有内容 FTPFile[] subFiles = client2.listFiles(dirToBeDelete); if (subFiles != null && subFiles.length > 0) { for (FTPFile subFile : subFiles) { if (!subFile.isDirectory()) { // 删除文件 client2.deleteFile(dirToBeDelete + "/" + subFile.getName()); } } // 再次尝试删除目录 client2.removeDirectory(dirToBeDelete); } } } client2.disconnect(); } } catch (Exception e) { log.error("备份失败:"+e.toString()); } } }