分布式文件存储–FastDFS

上传交互过程

    1. client询问tracker上传到的storage,不需要附加参数;
    1. tracker返回一台可用的storage;
    1. client直接和storage通讯完成文件上传。

下载交互过程

    1. client询问tracker下载文件的storage,参数为文件标识(卷名和文件名);
    1. tracker返回一台可用的storage;
    1. client直接和storage通讯完成文件下载。
  • 需要说明的是,client为使用FastDFS服务的调用方,client也应该是一台服务器,它对tracker和storage的调用均为服务器间的调用。

java整合FastDFS

/**
 * FastDFS 文件存取Utils
 */
public class FastDFSClient {

    static {
        //从classpath下获取文件对象获取路径
        String path = new ClassPathResource("fdfs_client.conf").getPath();
        try {
            ClientGlobal.init(path);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 图片上传
     *
     * @param file
     * @return
     */
    public static String[] upload(FastDFSFile file) {
        try {
            TrackerClient trackerClient = new TrackerClient();
            TrackerServer trackerServer = trackerClient.getConnection();
            StorageClient storageClient = new StorageClient(trackerServer, null);
            //参数1 字节数组
            //参数2 扩展名(不带点)
            //参数3 元数据( 文件的大小,文件的作者,文件的创建时间戳)
            NameValuePair[] meta_list = new NameValuePair[]{new NameValuePair(file.getAuthor()), new NameValuePair(file.getName())};
            String[] strings = storageClient.upload_file(file.getContent(), file.getExt(), meta_list);
            // strings[0]==group1  strings[1]=M00/00/00/wKjThF1aW9CAOUJGAAClQrJOYvs424.jpg
            return strings;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 图片下载
     *
     * @param groupName
     * @param remoteFileName
     * @return
     */
    public static InputStream downFile(String groupName, String remoteFileName) {
        ByteArrayInputStream byteArrayInputStream = null;
        try {
            //3.创建trackerclient对象
            TrackerClient trackerClient = new TrackerClient();
            //4.创建trackerserver 对象
            TrackerServer trackerServer = trackerClient.getConnection();
            //5.创建stroageserver 对象
            //6.创建storageclient 对象
            StorageClient storageClient = new StorageClient(trackerServer, null);
            //7.根据组名 和 文件名 下载图片

            //参数1:指定组名
            //参数2 :指定远程的文件名
            byte[] bytes = storageClient.download_file(groupName, remoteFileName);
            byteArrayInputStream = new ByteArrayInputStream(bytes);
            return byteArrayInputStream;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (byteArrayInputStream != null) {
                    byteArrayInputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    /**
     * 图片删除
     *
     * @param groupName
     * @param remoteFileName
     */
    public static void deleteFile(String groupName, String remoteFileName) {
        try {
            //3.创建trackerclient对象
            TrackerClient trackerClient = new TrackerClient();
            //4.创建trackerserver 对象
            TrackerServer trackerServer = trackerClient.getConnection();
            //5.创建stroageserver 对象
            //6.创建storageclient 对象
            StorageClient storageClient = new StorageClient(trackerServer, null);
            int i = storageClient.delete_file(groupName, remoteFileName);
            if (i == 0) {
                System.out.println("删除成功");
            } else {
                System.out.println("删除失败");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 根据组名获取组的信息
     *
     * @param groupName
     * @return
     */
    public static StorageServer getStorages(String groupName) {
        try {
            TrackerClient trackerClient = new TrackerClient();
            //4.创建trackerserver 对象
            TrackerServer trackerServer = trackerClient.getConnection();

            //参数1 指定traqckerserver 对象
            //参数2 指定组名
            StorageServer group1 = trackerClient.getStoreStorage(trackerServer, groupName);
            return group1;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 根据文件名和组名获取文件的信息
     *
     * @param groupName
     * @param remoteFileName
     * @return
     */
    public static FileInfo getFile(String groupName, String remoteFileName) {
        try {
            TrackerClient trackerClient = new TrackerClient();
            //4.创建trackerserver 对象
            TrackerServer trackerServer = trackerClient.getConnection();

            StorageClient storageClient = new StorageClient(trackerServer, null);

            //参数1 指定组名
            //参数2 指定文件的路径
            FileInfo fileInfo = storageClient.get_file_info(groupName, remoteFileName);
            return fileInfo;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 根据文件名和组名 获取组信息的数组信息
     *
     * @param groupName
     * @param remoteFileName
     * @return
     */
    public static ServerInfo[] getServerInfo(String groupName, String remoteFileName) {
        try {
            //3.创建trackerclient对象
            TrackerClient trackerClient = new TrackerClient();
            //4.创建trackerserver 对象
            TrackerServer trackerServer = trackerClient.getConnection();

            ServerInfo[] group1s = trackerClient.getFetchStorages(trackerServer, groupName, remoteFileName);
            return group1s;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;

    }

    /**
     * 获取tracker 的ip和端口的信息,
     * http://192.168.211.132:8080
     *
     * @return
     */
    public static String getTrackerUrl() {
        try {
            //3.创建trackerclient对象
            TrackerClient trackerClient = new TrackerClient();
            //4.创建trackerserver 对象
            TrackerServer trackerServer = trackerClient.getConnection();
            //tracker 的ip的信息
            String hostString = trackerServer.getInetSocketAddress().getHostString();

            //http://192.168.211.132:8080/group1/M00/00/00/wKjThF1aW9CAOUJGAAClQrJOYvs424.jpg img
            int g_tracker_http_port = ClientGlobal.getG_tracker_http_port();
            return "http://" + hostString + ":" + g_tracker_http_port;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

FastDFSFile

fdfs_client.conf

Original: https://www.cnblogs.com/dw3306/p/14562312.html
Author: 邓维-java
Title: 分布式文件存储–FastDFS

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/539174/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 常见API使用

    String类 字符串相关的类 Java程序中的所有字符串文字(例如”abc”)都实现为此类的实例 字符串是不变的 他们的值在创建后无法更改 Date类 D…

    Java 2023年6月8日
    047
  • VMware安装虚拟机详细步骤

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月7日
    062
  • 全链路压测的整体架构设计,以及5种实现方案流量染色方案、数据隔离方案、接口隔离方案、零侵入方案、服务监控方案【代码级别】

    业务模块介绍 现在我们对整体的业务进行介绍以及演示 5. 全链路整体架构 上面介绍了为什么需要全链路压测,下面来看下全链路压测的整体架构。 ​ 整体架构如下主要是对压测客户端的 压…

    Java 2023年6月15日
    0110
  • 为什么想做一件事,又如何坚持

    做一件事的动机是什么? 这个问题我想到最后,发现是”恐惧”。 想要 A,换个说法就是:害怕得不到 A;想成为 A,换个说法就是:害怕成不了 A。如果这两个公…

    Java 2023年6月16日
    069
  • 八、Java面向对象编程

    Java面向对象 初识面向对象 面向过程 & 面向对象 面向过程思想 步骤清晰简单,第一步做什么,第二部做什么… 面对过程适合处理一些较为简单的问题 面向对象思…

    Java 2023年6月7日
    067
  • springMVC 配置处理器映射器

    //bean 注入的是Jackson jar包 //可用注解驱动替代代替以上功能 Original: https://www.cnblogs.com/icemomo/p/16703…

    Java 2023年6月7日
    062
  • 关于img 403 forbidden的一些思考

    网页中经常需要显示图片给用户看,对网站本身来说有的图片是从本地图片服务器来的,但是一旦数量多了以后,磁盘空间又是一个问题。 所以有时就希望显示其他网站的Image,直接把其他网站的…

    Java 2023年6月5日
    055
  • JAVA 对象头分析及Synchronized锁

    JAVA 对象头分析及Synchronized锁 对象内存布局 HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头( Header)、实例数据( Instanc…

    Java 2023年5月29日
    055
  • 黑马头条–延迟任务精准发布文章

    1.添加任务 1.1.每次创建文章,就添加到任务中去 文章提交中调用添加任务方法 代码 @Override @Async public void addNewsToTask(Int…

    Java 2023年6月9日
    080
  • java操作JDBC实现增删改查工具类

    删除语句 package com;​import com.sun.xml.internal.bind.v2.model.core.ID;import com.util.jdbcut…

    Java 2023年6月7日
    091
  • 线程池使用

    线程池 1.工具类实现 undefined 线程池监控: long activeCount = ((ThreadPoolExecutor)instance).getActiveCo…

    Java 2023年6月9日
    074
  • 【每日算法】动态规划四

    难度[简单] 给定一个整数&#x6570…

    Java 2023年6月9日
    040
  • java 读取文本 读取每行字符串

    开发中难免遇到一些需要临时处理的问题, 比如产品经理给到你一个TXT文件,帮我把这个数据 怎么怎么样…很急 现在就要 当然这种事情也是见怪不怪 读取文件的代码其实平时用…

    Java 2023年6月5日
    070
  • 请求异常 RecoverableDataAccessException的另一种原因

    查询mysql数据报错: org.springframework.dao.RecoverableDataAccessException: 提示上面报错时,一般会分析是否是超时时间设…

    Java 2023年5月29日
    073
  • 深入Java内存模型之阅读理解(1)

    Java内存模型的抽象 在java中,所有实例域、静态域和数组元素存储在堆内存中,堆内存在线程之间共享(本文使用”共享变量”这个术语代指实例域,静态域和数组…

    Java 2023年5月29日
    0100
  • Java中 List、Set、Map 之间的区别

    一、List(列表) List的元素以线性方式存储,可以存放重复对象,List主要有以下两个实现类: ArrayList : 长度可变的数组,可以对元素进行随机的访问,向Array…

    Java 2023年5月29日
    074
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球