• (8)FastDFS


    1. 引入依赖
    2. 添加配置,踪迹服务器地址
    3. java配置
    4. FastFileStorageClient,uploadImage(inputstream,size,ext,null)
    5. StorePath(getFullPath getPath)

    什么是FastDFS?

    FastDFS是由淘宝的余庆先生所开发的一个轻量级、高性能的开源分布式文件系统。用纯C语言开发,功能丰富:

    • 文件存储

    • 文件同步

    • 文件访问(上传、下载)

    • 存取负载均衡

    • 在线扩容

    适合有大容量存储需求的应用或系统。同类的分布式文件系统有谷歌的GFS、HDFS(Hadoop)、TFS(淘宝)等。

    FastDFS的架构

    1.架构图

    FastDFS两个主要的角色:Tracker Server 和 Storage Server 。

    • Tracker Server:跟踪服务器,主要负责调度storage节点与client通信,在访问上起负载均衡的作用,和记录storage节点的运行状态,是连接client和storage节点的枢纽。

    • Storage Server:存储服务器,保存文件和文件的meta data(元数据),每个storage server会启动一个单独的线程主动向Tracker cluster中每个tracker server报告其状态信息,包括磁盘使用情况,文件同步情况及文件上传下载次数统计等信息

    • Group:文件组,多台Storage Server的集群。上传一个文件到同组内的一台机器上后,FastDFS会将该文件即时同步到同组内的其它所有机器上,起到备份的作用。不同组的服务器,保存的数据不同,而且相互独立,不进行通信。

    • Tracker Cluster:跟踪服务器的集群,有一组Tracker Server(跟踪服务器)组成。

    • Storage Cluster :存储集群,有多个Group组成。

    2.上传和下载流程

    1. Client通过Tracker server查找可用的Storage server。

    2. Tracker server向Client返回一台可用的Storage server的IP地址和端口号。

    3. Client直接通过Tracker server返回的IP地址和端口与其中一台Storage server建立连接并进行文件上传。

    4. 上传完成,Storage server返回Client一个文件ID,文件上传结束。

    1. Client通过Tracker server查找要下载文件所在的的Storage server。

    2. Tracker server向Client返回包含指定文件的某个Storage server的IP地址和端口号。

    3. Client直接通过Tracker server返回的IP地址和端口与其中一台Storage server建立连接并指定要下载文件。

    4. 下载文件成功。

    FastDFS安装

      参考文档

    FastDFS改造文件上传

    接下来,我们就用FastDFS改造leyou-upload工程。

    1.引入依赖

    在父工程中,我们已经管理了依赖,版本为:

    <fastDFS.client.version>1.26.2</fastDFS.client.version>

    因此,这里我们直接在taotao-upload工程的pom.xml中引入坐标即可:

    <dependency>
        <groupId>com.github.tobato</groupId>
        <artifactId>fastdfs-client</artifactId>
    </dependency>

    2.引入配置类

    纯java配置:

    @Configuration
    @Import(FdfsClientConfig.class)
    // 解决jmx重复注册bean的问题
    @EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING)
    public class FastClientImporter {
        
    }

    3.编写FastDFS属性

    在application.yml配置文件中追加如下内容:

    fdfs:
      so-timeout: 1501 # 超时时间
      connect-timeout: 601 # 连接超时时间
      thumb-image: # 缩略图
         60
        height: 60
      tracker-list: # tracker地址:你的虚拟机服务器地址+端口(默认是22122)
        - 192.168.56.101:22122

    4.配置hosts

    将来通过域名:image.leyou.com这个域名访问fastDFS服务器上的图片资源。所以,需要代理到虚拟机地址:

    配置hosts文件,使image.leyou.com可以访问fastDFS服务器

    5.测试

    创建测试类:

     把以下内容copy进去:

    @SpringBootTest
    @RunWith(SpringRunner.class)
    public class FastDFSTest {
    
        @Autowired
        private FastFileStorageClient storageClient;
    
        @Autowired
        private ThumbImageConfig thumbImageConfig;
    
        @Test
        public void testUpload() throws FileNotFoundException {
            // 要上传的文件
            File file = new File("C:\Users\joedy\Pictures\xbx1.jpg");
            // 上传并保存图片,参数:1-上传的文件流 2-文件的大小 3-文件的后缀 4-可以不管他
            StorePath storePath = this.storageClient.uploadFile(
                    new FileInputStream(file), file.length(), "jpg", null);
            // 带分组的路径
            System.out.println(storePath.getFullPath());
            // 不带分组的路径
            System.out.println(storePath.getPath());
        }
    
        @Test
        public void testUploadAndCreateThumb() throws FileNotFoundException {
            File file = new File("C:\Users\joedy\Pictures\xbx1.jpg");
            // 上传并且生成缩略图
            StorePath storePath = this.storageClient.uploadImageAndCrtThumbImage(
                    new FileInputStream(file), file.length(), "png", null);
            // 带分组的路径
            System.out.println(storePath.getFullPath());
            // 不带分组的路径
            System.out.println(storePath.getPath());
            // 获取缩略图路径
            String path = thumbImageConfig.getThumbImagePath(storePath.getPath());
            System.out.println(path);
        }
    }

    结果:

    group1/M00/00/00/wKg4ZVsWl5eAdLNZAABAhya2V0c424.jpg
    M00/00/00/wKg4ZVsWl5eAdLNZAABAhya2V0c424.jpg
    group1/M00/00/00/wKg4ZVsWmD-ARnWiAABAhya2V0c772.png
    M00/00/00/wKg4ZVsWmD-ARnWiAABAhya2V0c772.png
    M00/00/00/wKg4ZVsWmD-ARnWiAABAhya2V0c772_60x60.png

    访问第二组第一个路径:

     访问最后一个路径(缩略图路径),注意加组名(group1)

    6.改造上传逻辑

    @Service
    public class UploadService {
    
        @Autowired
        private FastFileStorageClient storageClient;
    
        private static final List<String> CONTENT_TYPES = Arrays.asList("image/jpeg", "image/gif");
    
        private static final Logger LOGGER = LoggerFactory.getLogger(UploadService.class);
    
        public String upload(MultipartFile file) {
    
            String originalFilename = file.getOriginalFilename();
            // 校验文件的类型
            String contentType = file.getContentType();
            if (!CONTENT_TYPES.contains(contentType)){
                // 文件类型不合法,直接返回null
                LOGGER.info("文件类型不合法:{}", originalFilename);
                return null;
            }
    
            try {
                // 校验文件的内容
                BufferedImage bufferedImage = ImageIO.read(file.getInputStream());
                if (bufferedImage == null){
                    LOGGER.info("文件内容不合法:{}", originalFilename);
                    return null;
                }
    
                // 保存到服务器
                // file.transferTo(new File("C:\leyou\images\" + originalFilename));
                String ext = StringUtils.substringAfterLast(originalFilename, ".");
                StorePath storePath = this.storageClient.uploadFile(file.getInputStream(), file.getSize(), ext, null);
    
                // 生成url地址,返回
                return "http://image.leyou.com/" + storePath.getFullPath();
            } catch (IOException e) {
                LOGGER.info("服务器内部错误:{}", originalFilename);
                e.printStackTrace();
            }
            return null;
        }
    }

    只需要把原来保存文件的逻辑去掉,然后上传到FastDFS即可。

    缺少两个依赖:

            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-pool2</artifactId>
                <version>2.4.1</version>
            </dependency>
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
                <version>3.4</version>
            </dependency>

     再补充一个依赖:

            <dependency>
                <groupId>commons-beanutils</groupId>
                <artifactId>commons-beanutils</artifactId>
                <version>1.9.3</version>
            </dependency>

    现在的问题是图片能存储到云服务器,但是通过路径不能回写到本地,初步估计是因为云服务器的真实地址绑定假的ip地址问题,通过本地解析的地址访问云服务器的问题如下:

     

     这个问题预留,等到在云服务器上运行项目再解决

    学习中,博客都是自己学习用的笔记,持续更新改正。。。
  • 相关阅读:
    【学习篇:他山之石,把玉攻】Ajax请求安全性讨论
    【学习篇:他山之石,把玉攻】JavaScript Date() 对象 及 格式化
    【学习篇:他山之石,把玉攻】jquery实现调用webservice
    前端制作中,IE6还有必要兼容吗?
    WordPress : Fatal error: Uncaught Error: Call to undefined function wp_recovery_mode()
    CF708E Student's Camp
    [BJWC2018]最长上升子序列
    P3177 [HAOI2015]树上染色
    CF187D BRT Contract
    CF1511E Colorings and Dominoes
  • 原文地址:https://www.cnblogs.com/Tunan-Ki/p/11922247.html
Copyright © 2020-2023  润新知