转载:https://blog.csdn.net/weixin_44044915/article/details/116199752
最近做的项目出现了一个bug(没考虑周全),Fastdfs把图片删掉之后,数据库中的数据还存在,导致扫描器执行删除程序时报错:错误结点2找到不该文件。
原因是Fastdfs删除图片用的是自带的路径判断方法,因为数据库中存在该条记录,所以url不为空。
即:!xxx.getFDFSFileUrl().isEmpty())
该语句不管删图片与否,一直为ture,于是调研Fastdfs是否有自带的判断文件是否存在的方法。
没有直接判断是否存在的方法,找到获取文件详情的方法,网上获取文件详情后判断是否的方法并行不通(Exsits不可行),研究了一下输出,发现判断是否为null行得通,具体代码如下:
pom依赖:
(记得Reload一下
<dependency>
<groupId>net.oschina.zcx7878</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>1.27.0.0</version>
</dependency>
实现方法:
import org.csource.fastdfs.*;
import java.io.IOException;
import org.csource.common.MyException;
public boolean testQueryFile(String fileUrl) throws IOException,MyException {
StorePath storePath = StorePath.parseFromUrl(fileUrl);
//fdfsConfig.getFdfsStorageHost()是fdst服务的IP地址,我写在了配置文件,所以直接获取。
String trackerServers = fdfsConfig.getFdfsStorageHost()+":22122";
ClientGlobal.initByTrackers(trackerServers);
TrackerClient trackerClient = new TrackerClient();
TrackerServer trackerServer = trackerClient.getConnection();
StorageServer storageServer = trackerClient.getStoreStorage(trackerServer);
StorageClient storageClient = new StorageClient(trackerServer, storageServer);
//storePath.getGroup()组名,storePath.getPath()文件路径
FileInfo fileInfo = storageClient.query_file_info(storePath.getGroup(), storePath.getPath());
//如果文件存在,返回ture
return fileInfo != null;
}
调用:
boolean fileExist =fdfsUtils.testQueryFile(image.getFDFSFileUrl());
//路径不为空且文件存在再执行删除方法,删除方法自行百度
if(!image.getFDFSFileUrl().isEmpty()&& fileExist){
try{
fdfsUtils.deleteFile(image.getFDFSFileUrl());
}catch (Exception e){
log.error(e);
}
}