当前位置:   article > 正文

Springboot整合FastDFS_fastdfsclient

fastdfsclient

一、FastDFS-Client的实践

1.FastDFS-Client的主要特性

  1. 对关键部分代码加入了单元测试,便于理解与服务器的接口交易,提高接口质量。
  2. 将以前对byte硬解析风格重构为使用对象+注解的形式,尽量增强了代码的可读性
  3. 支持对服务端的连接池管理
  4. 支持上传图片时,检查图片格式,并且自动生成缩略图
  5. 在springboot当中自动导入依赖

2.SpringBoot测试操作FastDFS

1.SpringBoot的配置
  • 将FastDFS-Client依赖引入pom.xml文件中:

    <!-- https://mvnrepository.com/artifact/com.github.tobato/fastdfs-client -->
    <dependency>
        <groupId>com.github.tobato</groupId>
        <artifactId>fastdfs-client</artifactId>
        <version>1.27.2</version>
    </dependency>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 在resource的application.yml文件下添加如下配置:

    #分布式文件系统配置
    
    fdfs:
      #连接超时
      connect-timeout: 600
      #连接时间
      so-timeout:  1500
      #配置tracker列表
      tracker-list:
        - 192.168.126.11:22122
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
2.测试springboot环境下javaapi对分布式文件系统上传文件的操作
  • 通过spring容器注入FastFileStorageClient对象,直接调用该对象的uploadFile方法来上传文件。
    代码如下:
    	//分布式文件系统fastdfs存储节点的客户端对象。
        @Autowired
        private FastFileStorageClient fastFileStorageClient;
    
        /**
         * 测试springboot环境下javaapi对分布式文件系统上传文件的操作
         */
         @Test
         public void testUpload() throws FileNotFoundException {
             //1.获取本地文件
             File file = new File("C:\\qycache\\picture\\11.jpg");
             //2.创建传输文件的输入流
             FileInputStream fileInputStream = new FileInputStream(file);
             //3.文件上传
             /**
              * 第一个参数:输入文件内容的输入流
              * 第二个参数:文件大小
              * 第三个参数:文件拓展名
              * 第四个参数:描述文件的元数据
              */
             StorePath storePath = fastFileStorageClient.uploadFile(fileInputStream, file.length(), "jpg", null);
             //4.将卷名和文件名一起打印
             System.out.println(storePath.getFullPath());
             System.out.println("~~~~~~~~~");
             //5.将卷名和文件名分开打印
             System.out.println(storePath.getGroup());
             System.out.println(storePath.getPath());
         }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    上传成功,返回结果如下:
    在这里插入图片描述
3.测试springboot环境下javaapi对分布式文件系统下载文件的操作
  • 直接调用 FastFileStorageClient对象的downloadFile方法来下载文件。
    代码如下:

    	 @Test
        public void testDownload() throws IOException {
             //1.下载文件
             /**
              * 第一个参数:文件在存储节点的卷名
              * 第二个参数:文件在存储节点的文件名
              * 第三个参数:下载的回调函数
              */
             byte[] bytes = fastFileStorageClient.downloadFile("group1", "M00/00/00/wKh-C2LmLPeAOt4sAAMj_qANmec894.jpg", new DownloadByteArray());
             //2.创建文件输出流
             FileOutputStream fileOutputStream = new FileOutputStream("c:\\qycache\\picture\\女子澡堂.jpg");
             //3.使用文件输出流将文件内容字节数组写出
             fileOutputStream.write(bytes);
             //4.刷新输出流
             fileOutputStream.flush();
             //5.关闭输出流
             fileOutputStream.close();
         }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    此时对应路径会出现女子澡堂.jpg。

3.SpringBoot操作FastDFS实现文件上传

  • 下载wangEditor.min.js:
    下载地址:https://www.jsdelivr.com/package/npm/wangeditor
    在这里插入图片描述
    解压后wangEditor.min.js在package/dist/目录下。

  • 将wangEditor.min.js文件放在resources/static目录下。

  • 在resources/templates目录下创建index.html,内容如下:

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>wangEditor demo</title>
    </head>
    <body>
    
    <div id="div1">
        <p>欢迎使用 <b>wangEditor</b> 富文本编辑器</p>
    </div>
    <script type="text/javascript" th:src="@{wangEditor.min.js}" src="../static/wangEditor.min.js"></script>
    
    <script type="text/javascript">
        const E = window.wangEditor;
        const editor = new E('#div1');
        //配置服务端接口
        editor.config.uploadImgServer = '/upload'
        //参数名字
        editor.config.uploadFileName = 'file'
        //限制图片大小
        editor.config.uploadImgMaxSize = 2 * 1024 * 1024 // 2M
        //限制图片类型
        editor.config.uploadImgAccept = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp']
        //限制一次最多能上传几张图片
        editor.config.uploadImgMaxLength = 5 // 一次最多上传 5 个图片
        editor.create()
    </script>
    
    </body>
    </html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
  • 引入thymeleaf和web依赖

    		<!--     引入thymeleaf   -->
            <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-thymeleaf -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-thymeleaf</artifactId>
    
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
  • 创建一个controller的package,在该package下创建UploadController类,添加如下内容:

    	//分布式文件系统fastdfs存储节点的客户端对象。
        @Autowired
        private FastFileStorageClient fastFileStorageClient;
        /**
         * 图片上传
         * @param file
         */
        @PostMapping("upload")
        public void upload(MultipartFile file) throws IOException {
            //1.判断文件是否为空
            if(!file.isEmpty())
            {
                //2.获取上传图片的名字
                String filename = file.getOriginalFilename();
                //3.图片后缀 jpg
                String fileSuffix = filename.substring(filename.lastIndexOf(".") + 1);
                //4.上传图片
                StorePath storePath = fastFileStorageClient.uploadFile(file.getInputStream(), file.getSize(), fileSuffix, null);
                //5.创建成功返回文件路径 打印输出,实际业务会将其保存到数据库
                System.out.println(storePath.getFullPath());
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

通过浏览器访问:localhost:8080,然后如图操作,在这里插入图片描述
因为wangEditor有固定的返回结果格式,但是没有返回值,所以他会出现上传图片失败!但是此时已经上传成功。
后台打印出group1/M00/00/00/wKh-C2LmS7mAQxj1AAMj_qANmec320.jpg即可。

二、FastDFS整合Nginx

1.作用

  • 为分布式文件系统提供Http服务支持
    通过nginx的web服务代理访问分布式文件系统的存储节点,从而实现通过http请求访问存储节点资源。
  • 解决复制延迟问题
    由于FastDFS的同卷存储节点之间需要同步,当文件尚未同步完成时,访问请求到达该结点,获取的数据将是未同步完的不完整数据,即为复制延迟问题。通过Nginx检测请求存储节点的数据,若该存储节点的数据尚未同步完成,则将请求转发至数据的原存储节点,从而解决复制延迟问题。

2.环境搭建

  • 进入到/usr/local目录下,下载FastDFS的Nginx模块包:wget https://github.com/happyfish100/fastdfs-nginx-module/archive/V1.22.tar.gz
  • 对下载的文件进行解压缩:tar -zxvf V1.22.tar.gz
  • 安装nginx依赖文件:yum install -y gcc gcc-c++ zlib zlib-devel openssl openssl-devel pcre pcre-devel gd-devel epel-release
  • 下载nginx软件包:wget https://nginx.org/download/nginx-1.22.0.tar.gz
  • 解压缩:tar -zxvf nginx-1.22.0.tar.gz
  • 然后将压缩包放在opt目录:mv nginx-1.22.0.tar.gz /opt
  • 进入nginx-1.22.0目录,添加第三方模块:./configure --add-module=/usr/local/fastdfs-nginx-module-1.22/src/
    即建立Makefile文件,检查Linux系统环境以及相关的关键属性。
  • 编译项目,主要将gcc源代码编译成可执行的目标文件:make
  • 根据上一步骤编译完成的数据安装到预定的目录中:make install
  • 进入到/usr/local/fast-6.06/conf目录,将FastDFS的http.conf和mime.types拷贝到/etc/fdfs/目录中:cp mime.types /etc/fdfs/cp http.conf /etc/fdfs/
  • 进入到/usr/local/fastdfs-nginx-module-1.22/src目录:cp mod_fastdfs.conf /etc/fdfs

3.文件配置

  • 进入到/etc/fdfs目录,编辑mod_fastdfs.conf;修改base_path,tracker_server,url_have_group_name,store_path0:base_path=/data/fastdfs/storagetracker_server=192.168.126.11:22122url_have_group_name = truestore_path0=/data/fastdfs/storage

  • 编辑nginx.conf:vim /usr/local/nginx/conf/nginx.conf

  • 在server块中添加如下location:

    	location ~ /group1/M00{
                    alias /data/fastdfs/storage/data;
                    ngx_fastdfs_module;
    
            }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    即匹配group1/M00,但是路径不拼接group1/M00;alias也就是说参与匹配的不拼接到路径中。并且使用ngx_fastdfs_module模块。

  • 进入到/usr/local/nginx/sbin目录下,启动nginx:./nginx -c /usr/local/nginx/conf/nginx.conf

  • 启动追踪服务tracker:fdfs_trackerd /etc/fdfs/tracker.conf start
    启动存储节点服务:fdfs_storaged /etc/fdfs/storage.conf start

  • 查看nginx服务启动情况:ps -ef | grep nginx,结果如下:
    在这里插入图片描述

  • 从浏览器访问分布式文件系统的图片:http://192.168.126.11/group1/M0/00/00/wKh-C2LmS7mAQxj1AAMj_qANmec320.jpg
    此时如果显示404,需要重新上传文件到storage,配置文件的路径都是新的,之前上传的无效。

总结:

1.Springboot整合FastDFS,需要引入整合依赖,在yml文件中配置配置tracker服务器的ip地址和端口号,在代码中需要引入FastFileStorageClient,即分布式文件系统fastdfs存储节点的客户端对象;然后对该客户端对象直接调用上传、下载等方法。
2.在没有FastDFS没有整合nginx之前,我们是不能直接通过浏览器访问上传的图片的。整合后,nginx提供了http服务支持,所以可以直接通过浏览器访问到。
并且nginx还能解决复制延迟问题,就是组内在同步期间,访问请求到达未同步完成的服务器,nginx会将请求转发给数据的原存储节点。
3.FastDFS整合nginx,需要nginx安装包以及ngx_fastdfs_module第三方模块,需要匹配的location块中使用该模块;并且需要修改第三方模块的conf文件。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/386683
推荐阅读
相关标签
  

闽ICP备14008679号