最近项目有上传/下载文件的需求,决定使用公司现有的fast-dfs做为文件服务器,发现github上有一个900+stars的FastDFS_Client 该作者基本重构了原作者的fastDfs Java api 整合了spring-boot,遂决定使用看看,一切配置ok,上传成功之后~ 发现了一个致命问题:删除文件方法总是定位到错误的StorageServer导致删除文件失败,看了该项目的Issues发现有很多人遇到了同样的问题,没有深究,果断放弃,还是改用了fastDfs原作者提供的Java Api...
整合过程
安装jar包至本地Maven仓库
因为看到几个大仓库官方是没有这个jar包的,用友云居然有,可是不能直接用到,还是乖乖下载并安装jar包到maven库吧,我使用的是1.27版本
- github下载 FastDfs Java Api zip包 本地解压后进入目录执行 mvn clean install 即可完成安装
- 项目中引入依赖
<!-- https://mvnrepository.com/artifact/org.csource/fastdfs-client-java --> <dependency> <groupId>org.csource</groupId> <artifactId>fastdfs-client-java</artifactId> <version>1.27-SNAPSHOT</version> </dependency>
项目配置(参考:FAST DFS JAVA SDK README)
由于我的项目使用了apollo配置中心,为了配合apollo热加载配置的特性,我使用了作者提供的直接初始化tracker-server的最简配置(Apollo 简介)
- 首先当然是apollo配置中心新建了FastDfs的公共配置
- 注入tracker_servers配置
该配置方式保证了每次获取连接时都使用apollo最新的tracker_servers配置@Value("${fastdfs.tracker_servers:1}") private String trackerServers; @Value("${fastdfs.url_prefix:1}") private String urlPrefix;
- 初始化tracker_server,获取storageServer连接
/** * 获取storageServer连接 * * @return */ public StorageClient1 getConnect() { StorageClient1 client = null; try { ClientGlobal.initByTrackers(trackerServers); TrackerClient tracker = new TrackerClient(); TrackerServer trackerServer = tracker.getConnection(); StorageServer storageServer = tracker.getStoreStorage(trackerServer); client = new StorageClient1(trackerServer, storageServer); } catch (IOException e) { log.error(e.getMessage()); } catch (MyException e) { log.error(e.getMessage()); } return client; }
- 获取连接操作fastDfs上传/删除
/** * 上传本地文件至FastDfs * * @param localFilePath * @return localFilePath 本地文件全路径 * @throws Exception */ public String uploadFile(String localFilePath) { File file = new File(localFilePath); StorageClient1 connect = this.getConnect(); String filePath = ""; try { filePath=connect.upload_file1(getFileByteArray(file), file.getName().split("\\.")[1], null); } catch (IOException e) { log.error(e.getMessage()); } catch (MyException e) { log.error(e.getMessage()); }finally { try { connect.close(); } catch (IOException e) { log.error(e.getMessage()); } } return filePath; }
/** * 根据fastdfs文件全路径删除FastDfs文件 * * @param fileId * @return */ public boolean deleteFile(String fileId) { StorageClient1 connect = this.getConnect(); boolean result = true; try { int i = connect.delete_file1(fileId.trim().replace(urlPrefix, "")); if (i > 0) { log.error("删除文件错误码:" + i); result = false; } } catch (IOException e) { log.error(e.getMessage()); } catch (MyException e) { log.error(e.getMessage()); }finally { try { connect.close(); } catch (IOException e) { log.error(e.getMessage()); } } return result; }
总结
没什么好说的~记录一下...
评论区