SpringBoot整合FastDFS进行文件上传

Author Avatar
AF_ 01月 07,2020
  • 使用微信扫码分享

最近项目有上传/下载文件的需求,决定使用公司现有的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的公共配置
    apollo 配置
  • 注入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;
    }
    

总结

没什么好说的~记录一下...