1.我在IDEA构建的是一个spring-boot项目,其他配置我就不写了,我在这里需要引入的包为
2.创建一个controller层方法,因为还有一个定时任务,所以我直接写在里面,节省时间,CarPassinfo是我的一个实体类名称,CommonUtils也是自己编写的一个工具包,这里设置的是定时删除8天前的数据,然后用在FtpUtils中比较文件夹的名称跟当前日期对应的8天前日期大小,比8天前小,执行删除,大于8天,跳过。
package com.ssist.modules.CarPassinfo.web;
import com.ssist.common.utils.CommonUtils;
import com.ssist.common.utils.FtpUtils;
import com.ssist.common.web.BaseController;
import com.ssist.modules.CarPassinfo.service.CarPassinfoService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
@RestController
public class CarPassinfoController extends BaseController implements ServletContextListener {
private Logger logger = LoggerFactory.getLogger(getClass());
@ResponseBody
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
Timer timer = new Timer();
//设置一个定时任务
timer.schedule(new TimerTask() {
public void run() {
//二、定时删除服务器里面的存储的文件夹
// 1.动态获取当前日期格式2018-12-05
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar c2 = Calendar.getInstance();
c2.setTime(new Date());
c2.add(Calendar.DATE , -8);
Date d2 = c2.getTime();
String day2 = sdf.format(d2);
// System.out.println("今天时间为:"+day2);
// 调用工具类删除服务器文件夹
FtpUtils ftp = new FtpUtils();
//传递过去的文件夹名称是2018-00-00格式
//读取配置文件里面设置的参数,下面的day2是我获取当前时间所对应的文件夹名称,可
//以转换成filename
String hostname = CommonUtils.props.getProperty("hostname");//ip
int port = Integer.valueOf(CommonUtils.props.getProperty("port"));//端口号
String username = CommonUtils.props.getProperty("username");
String password = CommonUtils.props.getProperty("password");
String pathname = CommonUtils.props.getProperty("pathname");//路径
ftp.deleteDirOrFile(hostname,port,username,password,pathname,day2);
}
},0,86400000);
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
}
}
3.创建一个FtpUtils工具类,里面有删除文件以及文件夹的方法。
package com.ssist.common.utils;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import java.io.IOException;
import java.net.MalformedURLException;
public class FtpUtils {
public FTPClient ftpClient = null;
/**
* 初始化ftp服务器
*/
public void initFtpClient(String hostname,int port,String username,String password){
ftpClient = new FTPClient();
ftpClient.setControlEncoding("UTF-8");
try {
System.out.println("connecting...服务器"+hostname+":"+port);
ftpClient.connect(hostname,port);//连接ftp服务器
ftpClient.login(username,password);//登录ftp服务器
int replyCode = ftpClient.getReplyCode();//是否成功登录服务器
if (!FTPReply.isPositiveCompletion(replyCode)){
System.out.println("connect failed...ftp服务器:"+hostname+":"+port);
}
System.out.println("connect successful...ftp服务器:"+hostname+":"+port);
} catch (MalformedURLException e){
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//删除当前日期8天前的文件夹
public void deleteDirOrFile(String hostname,int port,String username,String password,String pathname,String filename){
try {
initFtpClient(hostname,port,username,password);
if (pathname == null){
return;
}
FTPFile[] files = ftpClient.listFiles(pathname);
for (FTPFile f : files){
if (f.isDirectory()){
String dirname = f.getName();
//获取内部文件夹名称后格式化处理。判断其时间是否在当前时间的8天前
int result= dirname.compareTo(filename);
if (result >= 0){
return;
}else{
//切换FTP目录,还是当前目录
ftpClient.changeWorkingDirectory(pathname);
if (dirname == null){
return;
}
FTPFile[] files2 = ftpClient.listFiles(dirname);
for (FTPFile f2 : files2){
if (f2.isFile() && f2.toString().contains(".jpg") || f2.isFile() && f2.toString().contains(".JPG")){
ftpClient.dele(pathname+"/"+dirname+"/"+f2.getName());
System.out.println("删除图片成功");
}else if (f2.isDirectory()){
ftpClient.removeDirectory(pathname+"/"+f2);
System.out.println("删除子图片文件夹成功");
}
}
ftpClient.removeDirectory(pathname+"/"+f.getName());
System.out.println("删除图片文件夹成功");
}
}else if (f.isFile()){
return;
}
}
ftpClient.logout();
return;
} catch (IOException e) {
e.printStackTrace();
}finally {
if (ftpClient.isConnected()) {
try {
ftpClient.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
4.还有配置文件application.properties
#定时删除ftp上的图片
hostname=192.168.xx.xx
port=21
username=xxxx
password=xxxx
pathname=/home/picture/xxxx //自己的路径
5.自己编写一个测试方法,能够启动,都会先删除内部图片,然后在删除文件夹,如果有图片格式不一样,在逻辑判断中修改,有些文件夹中可能既有文件,又有文件夹,这个我也没想号怎么删除,我也参考了很多,但是都是无法正常删除,推荐两个网址,大家可以自己去看看:https://blog.csdn.net/justry_deng/article/details/82866777?utm_source=blogxgwz0
https://www.cnblogs.com/weihbs/p/7760552.html
我想了整一个礼拜,才总算做出来了,希望能给大家带来帮助,分享一下!