Springboot整合FastDFS

2023-11-02

一、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>
    
    
  • 在resource的application.yml文件下添加如下配置:

    #分布式文件系统配置
    
    fdfs:
      #连接超时
      connect-timeout: 600
      #连接时间
      so-timeout:  1500
      #配置tracker列表
      tracker-list:
        - 192.168.126.11:22122
    
    
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());
         }
    
    上传成功,返回结果如下:
    在这里插入图片描述
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();
         }
    
    

    此时对应路径会出现女子澡堂.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>
    
  • 引入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>
    
  • 创建一个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());
            }
        }
    

通过浏览器访问: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;
    
            }
    
    

    即匹配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文件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Springboot整合FastDFS 的相关文章

  • Java 枚举与创建位掩码和检查权限的混淆

    我想将此 c 权限模块移植到 java 但是当我无法将数值保存在数据库中然后将其转换为枚举表示形式时 我很困惑如何执行此操作 在 C 中 我创建一个如下所示的枚举 public enum ArticlePermission CanRead
  • 使用 LinkedList 实现下一个和上一个按钮

    这可能是一个愚蠢的问题 但我很难思考清楚 我编写了一个使用 LinkedList 来移动加载的 MIDI 乐器的方法 我想制作一个下一个和一个上一个按钮 以便每次单击该按钮时都会遍历 LinkedList 如果我硬编码itr next or
  • 为 java 游戏创建交互式 GUI

    大家好 我正在创建一个类似于 java 中的 farmville 的游戏 我只是想知道如何实现用户通常单击以与游戏客户端交互的交互式对象 按钮 我不想使用 swing 库 通用 Windows 看起来像对象 我想为我的按钮导入自定义图像 并
  • 动态选择端口号?

    在 Java 中 我需要获取端口号以在同一程序的多个实例之间进行通信 现在 我可以简单地选择一些固定的数字并使用它 但我想知道是否有一种方法可以动态选择端口号 这样我就不必打扰我的用户设置端口号 这是我的一个想法 其工作原理如下 有一个固定
  • Spring AspectJ 在双代理接口时失败:无法生成类的 CGLIB 子类

    我正在使用Spring的
  • 如何更改javaFX中按钮的图像?

    我正在使用javaFX 我制作了一个按钮并为此设置了图像 代码是 Image playI new Image file c Users Farhad Desktop icons play2 jpg ImageView iv1 new Ima
  • Java 集合的并集或交集

    建立并集或交集的最简单方法是什么Set在 Java 中 我见过这个简单问题的一些奇怪的解决方案 例如手动迭代这两个集合 最简单的单行解决方案是这样的 set1 addAll set2 Union set1 retainAll set2 In
  • 从最终实体获取根证书和中间证书

    作为密码学的菜鸟 我每天都会偶然发现一些简单的事情 今天只是那些日子之一 我想用 bouncy castle 库验证 java 中的 smime 消息 我想我几乎已经弄清楚了 但此时的问题是 PKIXparameters 对象的构建 假设我
  • 帮助将图像从 Servlet 获取到 JSP 页面 [重复]

    这个问题在这里已经有答案了 我目前必须生成一个显示字符串文本的图像 我需要在 Servlet 上制作此图像 然后以某种方式将图像传递到 JSP 页面 以便它可以显示它 我试图避免保存图像 而是以某种方式将图像流式传输到 JSP 自从我开始寻
  • jdbc mysql loginTimeout 不起作用

    有人可以解释一下为什么下面的程序在 3 秒后超时 因为我将其设置为在 3 秒后超时 12秒 我特意关闭了mysql服务器来测试mysql服务器无法访问的这种场景 import java sql Connection import java
  • 如何在用户输入数据后重新运行java代码

    嘿 我有一个基本的java 应用程序 显示人们是成年人还是青少年等 我从java开始 在用户输入年龄和字符串后我找不到如何制作它它们被归类为 我希望它重新运行整个过程 以便其他人可以尝试 的节目 我一直在考虑做一个循环 但这对我来说没有用
  • Spring Boot Data JPA 从存储过程接收多个输出参数

    我尝试通过 Spring Boot Data JPA v2 2 6 调用具有多个输出参数的存储过程 但收到错误 DEBUG http nio 8080 exec 1 org hibernate engine jdbc spi SqlStat
  • 如何对不同的参数类型使用相同的java方法?

    我的问题 我有 2 个已定义的记录 创建对象请求 更新对象请求 必须通过实用方法进行验证 由于这两个对象具有相同的字段 因此可以对这两种类型应用相同的验证方法 现在我只是使用两种方法进行重载 但它很冗长 public record Crea
  • Java 和 Python 可以在同一个应用程序中共存吗?

    我需要一个 Java 实例直接从 Python 实例数据存储中获取数据 我不知道这是否可能 数据存储是否透明 唯一 或者每个实例 如果它们确实可以共存 都有其单独的数据存储 总结一下 Java 应用程序如何从 Python 应用程序的数据存
  • Eclipse 选项卡宽度不变

    我浏览了一些与此相关的帖子 但它们似乎并不能帮助我解决我的问题 我有一个项目 其中 java 文件以 2 个空格的宽度缩进 我想将所有内容更改为 4 空格宽度 我尝试了 正确的缩进 选项 但当我将几行修改为 4 空格缩进时 它只是将所有内容
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • Cucumber 0.4.3 (cuke4duke) 与 java + maven gem 问题

    我最近开始为 Cucumber 安装一个示例项目 并尝试使用 maven java 运行它 我遵循了这个指南 http www goodercode com wp using cucumber tests with maven and ja
  • 如何使用mockito模拟构建器

    我有一个建造者 class Builder private String name private String address public Builder setName String name this name name retur
  • 长轮询会冻结浏览器并阻止其他 ajax 请求

    我正在尝试在我的中实现长轮询Spring MVC Web 应用程序 http static springsource org spring docs 2 0 x reference mvc html但在 4 5 个连续 AJAX 请求后它会
  • 使用 svn 1.8.x、subclise 1.10 的 m2e-subclipse 连接器在哪里?

    我读到 m2e 的生产商已经停止生产 svn 1 7 以外的任何版本的 m2e 连接器 Tigris 显然已经填补了维护 m2e subclipse 连接器的空缺 Q1 我的问题是 使用 svn 1 8 x 的 eclipse 更新 url

随机推荐

  • 【Transformer架构】Transformers are RNNs (linear transformer)

    原始题目 Transformers are RNNs Fast Autoregressive Transformers with Linear Attention 中文翻译 Transformers 是RNNs 带线性Attention的快
  • C++ error: non-const lvalue reference to type

    今晚看交流群的消息 看到大家在讨论一个有意思的问题 int array 5 0 int const p array 编译通过 const int p array 编译失败 报错 error non const lvalue referenc
  • SpringBoot整合quartz(支持多个任务和job支持spring管理的对象)

    工作中经常遇到quartz的job注入的spring对象为null 原因是这样的 quartz每次执行一次job会将执行完成后的job销毁 下次执行的时候 重新new 这就导致job中的 Autowired注入的Spring对象为null
  • 前端如何获取文件后缀名

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前端如何获取文件后缀名 二 使用代码如下 1 引入库 总结 前端如何获取文件后缀名 二 使用代码如下 1 引入库 代码如下 示例 选择文件后返回 resultDat
  • 实现求欧拉回路算法(C++)

    一 算法介绍及实现过程 程序的输入为对应图的结点数和图中与各结点相连的点的编号 注 无向图中的多重边和自环需多次输入 有向图中的多重边需多次输入 程序的第一步是求出图的邻接矩阵 邻接矩阵反映了点与点之间的关系 通过输入各结点相连的点的编号
  • go的make用法

    make用法和参数用法 golang分配内存有一个make函数 该函数第一个数类型 第二个参数的分配的空间 第三个 参数时预留分配空间 前两个参数很好理解 但对第三个参数不是很理解 例如a make int 5 10 len a 输出结果为
  • Golang-语言源码级调试器 Delve

    前言 Go 目前的调试器有如下几种 GDB 最早期的调试工具 现在用的很少 LLDB macOS 系统推荐的标准调试工具 单 Go 的一些专有特性支持的比较少 Delve 专门为 Go 语言打造的调试工具 使用最为广泛 本篇简单说明如何使用
  • OC使用cocoapods导入swift库注意

    首先就是在 targets gt Build Setting gt Packaging 中设置 Defines Module为YES 然后创建swift文件时会生成 文件名 Bridging Header h 这样一个桥接文件 怎样使用co
  • 针对低分辨率或小目标的卷积-SPDConv

    针对低分辨率或小目标的卷积 SPDConv 摘要 引言 A New Building Block SPD Conv 附录 代码 摘要 卷积神经网络在许多计算机视觉任务中取得了巨大成功 然而 在图像低分辨率或目标较小任务上 他们的性能迅速下降
  • 数据分析统计题目

    提示 本文章数据和题目来源于互联网 如有雷同 请联系作者删除 文章目录 前言 二 题集 第一题 第二题 第三题 第四题 前言 公司内部招募数据分析团队 特出此题集 检测各位参与同学的学习态度和能力 二 题集 第一题 某地101例健康男子血清
  • 已解决 I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with on

    已解决WARNING tensorflow From
  • 规则引擎Drools使用 第一篇 规则引擎认知

    规则引擎有什么用呢 可以在那些实际场景使用呢 思考这样一个问题 申请信用卡 每个人去申请信用卡的时候 都会经过一遍核查 这个核查过程其实就可以当做是根据规则 去校验你的信息是否符合规则 只有符合规则的才可以申请信用卡 还记得以前自己写的那些
  • Elasticsearch的算法介绍

    1 算法介绍 relevance score算法 简单来说 就是计算出 一个索引中的文本 与搜索文本 他们之间的关联匹配程度 Elasticsearch使用的是 term frequency inverse document frequen
  • 深入了解JVM的底层原理

    引言 什么是JVM JVM在整个jdk java 运行环境 中处于最底层 负责与操作系统的交互 用来屏蔽操作系统环境 提供一个完整的Java运行环境 因此也就虚拟计算机 操作系统装入JVM是通过jdk中Java exe来完成 通过下面4步来
  • 蒙特卡洛模拟计算风险价值VAR之R语言实现

    一 解析VAR 当在分析方法中计算风险价值 VAR 时 我们需要假设金融工具的返回遵循一定的概率分布 最常用的是正态分布 这也是为什么我们通常称它为delta normal方法 要计算VAR 我们需要找到一个阈值 T 来确定显著性 如95
  • ApiSix 配置 jwt-auth认证

    有问题要学会阅读apisix官方文档 养成好习惯 点我开始学习 1 为签发 token 的 API 配置一个 Route 该路由将使用 public api 插件 在对应的服务器执行以下命令 我尝试通过面板来创建这个Route 发现创建的时
  • Fedora21 入门体验笔记

    以前都是由于对linux的好奇 所以把各种版本都装了个遍 但每次都会因为某些原因 eq 不能玩游戏 用 很麻烦而且不爽 没用几天然后又回到windows 而且最后什么都没有留下 这一次是想真正学习linux 顺便记下使用过程中遇到的一些问题
  • OpenGL 入门教程(八)

    OpenGL 入门教程 八 OpenGL中使用RGBA色彩体系 RGB为红绿蓝三原色 A为 值 该值代表色彩融合时所占的比例 颜色是顶点的重要属性之一 没有色彩的世界是毫无生气的 使用glColor R G B A 设定当前颜色 此后定义所
  • pyecharts各种图表实现(超级全)

    目录 平面直角坐标系 直方图 折线图 箱形图 散点图 带涟漪效果散点图 k线图 热力图 象型图 层叠图 地理图表 GEO 地理坐标系 MAP 地图 BMAP 百度地图 基本图表 饼图 漏斗图 仪表盘 水球图 日历图 关系图 平行坐标系 极坐
  • Springboot整合FastDFS

    文章目录 一 FastDFS Client的实践 1 FastDFS Client的主要特性 2 SpringBoot测试操作FastDFS 1 SpringBoot的配置 2 测试springboot环境下javaapi对分布式文件系统上