当前位置:   article > 正文

Spring Boot集成fastdfs快速入门Demo

Spring Boot集成fastdfs快速入门Demo

1.什么是fastdfs

FastDFS 是一个开源的高性能分布式文件系统(DFS)。它的主要功能包括:文件存储,文件同步和文件访问,以及高容量和负载平衡。主要解决了海量数据存储问题,特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务。
FastDFS 系统有三个角色:跟踪服务器(Tracker Server)、存储服务器(Storage Server)和客户端(Client)。

  • Tracker Server:跟踪服务器,主要做调度工作,起到均衡的作用;负责管理所有的 storage server和 group,每个 storage 在启动后会连接 Tracker,告知自己所属 group 等信息,并保持周期性心跳。

  • Storage Server:存储服务器,主要提供容量和备份服务;以 group 为单位,每个 group 内可以有多台 storage server,数据互为备份。

  • Client:客户端,上传下载数据的服务器,也就是我们自己的项目所部署在的服务器。

9926a690335ae06b2fc01111a34c7021.png

目前fastdfs基本处于淘汰阶段,大家可以尝试用minio,具体介绍 >>> Spring Boot集成Minio快速入门demo

2.fastdfs环境搭建

搜索镜像

docker search fastdfs

拉取镜像(已经内置Nginx)

docker pull delron/fastdfs

构建Tracker

  1. # 22122 => Tracker默认端口
  2. docker run --name=tracker-server --privileged=true -p 22122:22122 -v /var/fdfs/tracker:/var/fdfs --network=host -d delron/fastdfs tracker

构建Storage

  1. # 23000 => Storage默认端口
  2. # 8888 => 内置Nginx默认端口
  3. # TRACKER_SERVER => 执行Tracker的ip和端口
  4. # --net=host => 避免因为Docker网络问题导致外网客户端无法上传文件,因此使用host网络模式
  5. docker run --name=storage-server --privileged=true -p 23000:23000 -p 8888:8888 -v /var/fdfs/storage:/var/fdfs -e TRACKER_SERVER=10.11.68.77:22122 -e GROUP_NAME=group1 --network=host -d delron/fastdfs storage

查看容器

docker ps

3.代码工程

 实验目的:实现文件上传

pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>springboot-demo</artifactId>
  7. <groupId>com.et</groupId>
  8. <version>1.0-SNAPSHOT</version>
  9. </parent>
  10. <modelVersion>4.0.0</modelVersion>
  11. <artifactId>fastdfs</artifactId>
  12. <properties>
  13. <maven.compiler.source>8</maven.compiler.source>
  14. <maven.compiler.target>8</maven.compiler.target>
  15. </properties>
  16. <dependencies>
  17. <dependency>
  18. <groupId>org.springframework.boot</groupId>
  19. <artifactId>spring-boot-starter-web</artifactId>
  20. </dependency>
  21. <dependency>
  22. <groupId>org.springframework.boot</groupId>
  23. <artifactId>spring-boot-autoconfigure</artifactId>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework.boot</groupId>
  27. <artifactId>spring-boot-starter-test</artifactId>
  28. <scope>test</scope>
  29. </dependency>
  30. <dependency>
  31. <groupId>com.github.tobato</groupId>
  32. <artifactId>fastdfs-client</artifactId>
  33. <version>1.26.2</version>
  34. </dependency>
  35. <dependency>
  36. <groupId>org.projectlombok</groupId>
  37. <artifactId>lombok</artifactId>
  38. </dependency>
  39. </dependencies>
  40. </project>

application.yaml

  1. server:
  2. port: 8088
  3. fdfs:
  4. soTimeout: 1500
  5. connectTimeout: 600
  6. thumbImage: #thumbImage param
  7. width: 150
  8. height: 150
  9. trackerList: #TrackerList参数,支持多个
  10. - 10.11.68.77:22122

controller

  1. package com.et.fastdfs.controller;
  2. import com.et.fastdfs.util.FastDFSClientWrapper;
  3. import org.springframework.http.ResponseEntity;
  4. import org.springframework.stereotype.Controller;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.RequestMethod;
  7. import org.springframework.web.bind.annotation.ResponseBody;
  8. import org.springframework.web.bind.annotation.RestController;
  9. import org.springframework.web.multipart.MultipartFile;
  10. import javax.annotation.Resource;
  11. import javax.servlet.http.HttpServletRequest;
  12. import javax.servlet.http.HttpServletResponse;
  13. import java.util.HashMap;
  14. import java.util.Map;
  15. @RestController
  16. public class HelloWorldController {
  17. @RequestMapping("/hello")
  18. public Map<String, Object> showHelloWorld(){
  19. Map<String, Object> map = new HashMap<>();
  20. map.put("msg", "HelloWorld");
  21. return map;
  22. }
  23. @Resource
  24. private FastDFSClientWrapper dfsClient;
  25. @RequestMapping(value = "/upload", method = RequestMethod.POST)
  26. public ResponseEntity<Map<String, Object>> upload(MultipartFile file, HttpServletRequest request, HttpServletResponse response) throws Exception {
  27. Map<String, Object> map = new HashMap<>();
  28. String fileUrl = dfsClient.uploadFile(file);
  29. map.put("file_url", fileUrl);
  30. return ResponseEntity.ok(map);
  31. }
  32. }

util工具类

  1. package com.et.fastdfs.util;
  2. import com.et.fastdfs.constant.FastDFSConstants;
  3. import com.github.tobato.fastdfs.domain.StorePath;
  4. import com.github.tobato.fastdfs.exception.FdfsUnsupportStorePathException;
  5. import com.github.tobato.fastdfs.service.FastFileStorageClient;
  6. import lombok.extern.log4j.Log4j2;
  7. import org.apache.commons.io.FilenameUtils;
  8. import org.apache.commons.lang3.StringUtils;
  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import org.springframework.stereotype.Component;
  11. import org.springframework.web.multipart.MultipartFile;
  12. import java.io.ByteArrayInputStream;
  13. import java.io.IOException;
  14. import java.nio.charset.Charset;
  15. /**
  16. * Description: FastDFS文件上传下载包装类
  17. */
  18. @Component
  19. @Log4j2
  20. public class FastDFSClientWrapper {
  21. @Autowired
  22. private FastFileStorageClient storageClient;
  23. /**
  24. * 上传文件
  25. * @param file 文件对象
  26. * @return 文件访问地址
  27. * @throws IOException
  28. */
  29. public String uploadFile(MultipartFile file) throws IOException {
  30. StorePath storePath = storageClient.uploadFile(file.getInputStream(),file.getSize(), FilenameUtils.getExtension(file.getOriginalFilename()),null);
  31. return getResAccessUrl(storePath);
  32. }
  33. /**
  34. * 将一段字符串生成一个文件上传
  35. * @param content 文件内容
  36. * @param fileExtension
  37. * @return
  38. */
  39. public String uploadFile(String content, String fileExtension) {
  40. byte[] buff = content.getBytes(Charset.forName("UTF-8"));
  41. ByteArrayInputStream stream = new ByteArrayInputStream(buff);
  42. StorePath storePath = storageClient.uploadFile(stream,buff.length, fileExtension,null);
  43. return getResAccessUrl(storePath);
  44. }
  45. // 封装图片完整URL地址
  46. private String getResAccessUrl(StorePath storePath) {
  47. String fileUrl = FastDFSConstants.HTTP_PRODOCOL + "://" + FastDFSConstants.RES_HOST + "/" + storePath.getFullPath();
  48. return fileUrl;
  49. }
  50. /**
  51. * 删除文件
  52. * @param fileUrl 文件访问地址
  53. * @return
  54. */
  55. public void deleteFile(String fileUrl) {
  56. if (StringUtils.isEmpty(fileUrl)) {
  57. return;
  58. }
  59. try {
  60. StorePath storePath = StorePath.praseFromUrl(fileUrl);
  61. storageClient.deleteFile(storePath.getGroup(), storePath.getPath());
  62. } catch (FdfsUnsupportStorePathException e) {
  63. log.warn(e.getMessage());
  64. }
  65. }
  66. // 除了FastDFSClientWrapper类中用到的api,客户端提供的api还有很多,可根据自身的业务需求,将其它接口也添加到工具类中即可。
  67. // 上传文件,并添加文件元数据
  68. //StorePath uploadFile(InputStream inputStream, long fileSize, String fileExtName, Set<MateData> metaDataSet);
  69. // 获取文件元数据
  70. //Set<MateData> getMetadata(String groupName, String path);
  71. // 上传图片并同时生成一个缩略图
  72. //StorePath uploadImageAndCrtThumbImage(InputStream inputStream, long fileSize, String fileExtName, Set<MateData> metaDataSet);
  73. // 。。。
  74. }

以上只是一些关键代码,所有代码请参见下面代码仓库

代码仓库

  • https://github.com/Harries/springboot-demo

4.测试

  •  启动Spring Boot工程

  • postman上传文件测试

fe85f411ce0773ea44f9420f29dec54f.png

5.引用

  • https://www.cnblogs.com/cao-lei/p/13470695.html

  • https://github.com/ligohan/springboot-fastdfs-demo/tree/master?tab=readme-ov-file

  • http://www.liuhaihua.cn/archives/710431.html

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

闽ICP备14008679号