FastDFS教程(三):使用Java代码操作文件

第一步:导入FastDFS的Jar包

进入https://github.com/happyfish100/fastdfs-client-java,下载文件。可以看到,有很多种生成jar文件的方式,有ant、maven等。

<dependency>
  <groupId>org.csource</groupId>
	<artifactId>fastdfs-client-java</artifactId>
	<scope>system</scope>
	<version>1.27-SNAPSHOT</version>
</dependency>
第二步:使用API
  1. src/main/resources目录下创建文件fdfs_client.conf,并添加如下内容

    IP和端口根据实际的情况修改。该配置文件的其他选项,参照https://github.com/happyfish100/fastdfs-client-java配置。

    connect_timeout = 2
    network_timeout = 30
    charset = ISO8859-1
    http.tracker_http_port = 8080
    http.anti_steal_token = no
    http.secret_key = FastDFS1234567890
    
    tracker_server = IP地址:22122
    tracker_server = IP地址:22122
    tracker_server = IP地址:22122
    

    注1:tracker_server指向您自己的tracker服务器的IP地址和端口,1-n

    注2:除了tracker_server,其它配置项都是可选的

  2. 基本的文件上传代码

    /**
     * Create By: 刘建
     * Date: 2019/9/25
     * Time: 4:12 PM
     * Description: No Description
     */
    public class FastDFSTest {
    
        @Test
        public void testFastDFS() throws IOException, MyException {
            //初始化tracker客户端
            ClientGlobal.init("fdfs_client.conf");
            TrackerClient trackerClient = new TrackerClient();
            InputStream in = getClass().getClassLoader().getResourceAsStream("fdfs_client.conf");
            byte[] b = new byte[in.available()];
            in.read(b);
            //不要复用它,每次操作文件都进行此操作
            TrackerServer trackerServer = trackerClient.getConnection();
    
    
            //从tracker获取storage
            StorageClient storageClient = new StorageClient(trackerServer, null);
    
            //上传文件到storage服务器
            String[] result = storageClient.upload_file(b, "txt", null);
            System.out.println(Arrays.toString(result));
        }
    }
    
  3. 封装成Util 下面是Java操作FastDFS进行文件上传、下载和删除的代码。

public final class FastDFSHelper {
    private static final Logger logger = LoggerFactory.getLogger(FastDFSHelper.class);
    private static TrackerClient trackerClient;
 
    static {
        try {
            ClientGlobal.init("fdfs_client.conf");
            trackerClient = new TrackerClient();
        } catch (IOException | MyException e) {
            logger.error("error", e);
        }
    }
 
    /**
     * 向FastDFS上传文件
     *
     * @param localFilename 本地文件名
     * @return 上传成功,返回组名和该文件在FastDFS中的名称;上传失败,返回null
     */
    public static void uploadFile(String localFilename) {
        TrackerServer trackerServer;
        try {
            trackerServer = trackerClient.getConnection();
        } catch (IOException e) {
            logger.error("error", e);
            return;
        }
        StorageClient storageClient = new StorageClient(trackerServer, null);
        try {
            String[] arr = storageClient.upload_file(localFilename, null, null);
            if (arr == null || arr.length != 2) {
                logger.error("向FastDFS上传文件失败");
            } else {
                logger.info("向FastDFS上传文件成功");
            }
        } catch (IOException | MyException e) {
            logger.error("error", e);
        } finally {
            closeTrackerServer(trackerServer);
        }
    }
 
    /**
     * 从FastDFS下载文件
     *
     * @param localFilename  本地文件名
     * @param groupName      文件在FastDFS中的组名
     * @param remoteFilename 文件在FastDFS中的名称
     */
    public static void downloadFile(String localFilename, String groupName, String remoteFilename) {
       TrackerServer trackerServer;
        try {
            trackerServer = trackerClient.getConnection();
        } catch (IOException e) {
            logger.error("error", e);
            return;
        }
        StorageClient storageClient = new StorageClient(trackerServer, null);
        File file = new File(localFilename);
        try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file))) {
            byte[] content = storageClient.download_file(groupName, remoteFilename);
            if (content == null || content.length == 0) {
                logger.error("文件大小为空!");
                boolean flag = file.delete();
                logger.info("删除文件结果:{}", flag);
                return;
            }
            bos.write(content);
            logger.info("成功下载文件: " + localFilename);
        } catch (IOException | MyException e) {
            logger.error("error", e);
        } finally {
            closeTrackerServer(trackerServer);
        }
    }
 
    /**
     * 从FastDFS删除文件
     *
     * @param localFilename  本地文件名
     * @param groupName      文件在FastDFS中的组名
     * @param remoteFilename 文件在FastDFS中的名称
     */
    public static void deleteFile(String localFilename, String groupName, String remoteFilename) {
        TrackerServer trackerServer;
        try {
            trackerServer = trackerClient.getConnection();
        } catch (IOException e) {
            logger.error("error", e);
            return;
        }
        StorageClient storageClient = new StorageClient(trackerServer, null);
        try {
            int i = storageClient.delete_file(groupName, remoteFilename);
            if (i == 0) {
                logger.info("FastDFS删除文件成功");
            } else {
                logger.info("FastDFS删除文件失败");
            }
        } catch (IOException | MyException e) {
            logger.error("error", e);
        } finally {
            closeTrackerServer(trackerServer);
        }
    }
 
    private static void closeTrackerServer(TrackerServer trackerServer) {
        try {
            if (trackerServer != null) {
                logger.info("关闭trackerServer连接");
                trackerServer.close();
            }
        } catch (IOException e) {
            logger.error("error", e);
        }
    }
}


上述代码中,因为配置文件 fdfs_client.conf 是不变的,而且 trackerClient 是通过读取 fdfs_client.conf 文件来创建的,所以复用了 trackerClient 。 trackerServer 最好不要复用,因为通过源码可以发现,每次通过 trackerClient.getConnection 获取连接的时候,都会在所有的 trackerServer 中选一个;如果复用,则 trackerServer 就被固定成了一个,失去了多个 trackerServer 的意义。每次操作结束,只需要关闭 trackerServer 。因为从源码中可以发现,作者已经为我们调用了 storageServer.close 方法,并将对象置空。

在实际应用中,应该记录下本地文件名和FastDFS中组名与文件名称的映射关系,在此省略。

参考博客

​ 1、在web项目中使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值