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:客户端,上传下载数据的服务器,也就是我们自己的项目所部署在的服务器。

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


2.fastdfs环境搭建

搜索镜像



docker search fastdfs

拉取镜像(已经内置Nginx)



docker pull delron/fastdfs

构建Tracker



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

构建Storage



# 23000 => Storage默认端口# 8888 => 内置Nginx默认端口# TRACKER_SERVER => 执行Tracker的ip和端口# --net=host => 避免因为Docker网络问题导致外网客户端无法上传文件,因此使用host网络模式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



<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>springboot-demo</artifactId> <groupId>com.et</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion>
<artifactId>fastdfs</artifactId>
<properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties> <dependencies>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.github.tobato</groupId> <artifactId>fastdfs-client</artifactId> <version>1.26.2</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies></project>

application.yaml

server:  port: 8088fdfs:  soTimeout: 1500  connectTimeout: 600  thumbImage:             #thumbImage param    width: 150    height: 150  trackerList:            #TrackerList参数,支持多个    - 10.11.68.77:22122

controller



package com.et.fastdfs.controller;
import com.et.fastdfs.util.FastDFSClientWrapper;import org.springframework.http.ResponseEntity;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.util.HashMap;import java.util.Map;@RestControllerpublic class HelloWorldController { @RequestMapping("/hello") public Map<String, Object> showHelloWorld(){ Map<String, Object> map = new HashMap<>(); map.put("msg", "HelloWorld"); return map; } @Resource private FastDFSClientWrapper dfsClient; @RequestMapping(value = "/upload", method = RequestMethod.POST) public ResponseEntity<Map<String, Object>> upload(MultipartFile file, HttpServletRequest request, HttpServletResponse response) throws Exception { Map<String, Object> map = new HashMap<>(); String fileUrl = dfsClient.uploadFile(file); map.put("file_url", fileUrl); return ResponseEntity.ok(map);
}}

util工具类

package com.et.fastdfs.util;
import com.et.fastdfs.constant.FastDFSConstants;import com.github.tobato.fastdfs.domain.StorePath;import com.github.tobato.fastdfs.exception.FdfsUnsupportStorePathException;import com.github.tobato.fastdfs.service.FastFileStorageClient;import lombok.extern.log4j.Log4j2;import org.apache.commons.io.FilenameUtils;import org.apache.commons.lang3.StringUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayInputStream;import java.io.IOException;import java.nio.charset.Charset;
/** * Description: FastDFS文件上传下载包装类 */@Component@Log4j2public class FastDFSClientWrapper {
@Autowired private FastFileStorageClient storageClient;
/** * 上传文件 * @param file 文件对象 * @return 文件访问地址 * @throws IOException */ public String uploadFile(MultipartFile file) throws IOException { StorePath storePath = storageClient.uploadFile(file.getInputStream(),file.getSize(), FilenameUtils.getExtension(file.getOriginalFilename()),null); return getResAccessUrl(storePath); }
/** * 将一段字符串生成一个文件上传 * @param content 文件内容 * @param fileExtension * @return */ public String uploadFile(String content, String fileExtension) { byte[] buff = content.getBytes(Charset.forName("UTF-8")); ByteArrayInputStream stream = new ByteArrayInputStream(buff); StorePath storePath = storageClient.uploadFile(stream,buff.length, fileExtension,null); return getResAccessUrl(storePath); }
// 封装图片完整URL地址 private String getResAccessUrl(StorePath storePath) { String fileUrl = FastDFSConstants.HTTP_PRODOCOL + "://" + FastDFSConstants.RES_HOST + "/" + storePath.getFullPath(); return fileUrl; }
/** * 删除文件 * @param fileUrl 文件访问地址 * @return */ public void deleteFile(String fileUrl) { if (StringUtils.isEmpty(fileUrl)) { return; } try { StorePath storePath = StorePath.praseFromUrl(fileUrl); storageClient.deleteFile(storePath.getGroup(), storePath.getPath()); } catch (FdfsUnsupportStorePathException e) { log.warn(e.getMessage()); } }
// 除了FastDFSClientWrapper类中用到的api,客户端提供的api还有很多,可根据自身的业务需求,将其它接口也添加到工具类中即可。 // 上传文件,并添加文件元数据 //StorePath uploadFile(InputStream inputStream, long fileSize, String fileExtName, Set<MateData> metaDataSet); // 获取文件元数据 //Set<MateData> getMetadata(String groupName, String path); // 上传图片并同时生成一个缩略图 //StorePath uploadImageAndCrtThumbImage(InputStream inputStream, long fileSize, String fileExtName, Set<MateData> metaDataSet); // 。。。}

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

代码仓库

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

4.测试

  •  启动Spring Boot工程

  • postman上传文件测试

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

相关推荐

  • Meta无限长文本大模型来了:参数仅7B,已开源
  • 大模型综述出书了
  • CCF-NLP走进高校之“走进厦门大学”
  • [开源]一款用于学习和研究的模仿 抖音 | TikTok 的移动端短视频项目
  • 5000w+ 的大表如何拆?亿级别大表拆分实战复盘
  • 也看文档处理分而治之策略:PDF文档的Pipeline式处理逻辑
  • 阻止无谓消耗、提升学习效率的CHROME小插件
  • 注意,把Python库都安装在一个环境里,可能会“非常危险”!
  • 每日prompt:安静的猫
  • 2024 年人工智能指数报告值得看一下
  • 从失业低谷到月收入10w+,这一年我做对了什么
  • 参战万亿MoE模型!上海大模型独角兽出手,腾讯阿里米哈游参投
  • 欧洲版OpenAI又要融资!估值50亿美元,Llama 2“套壳”也能半年估值翻番?
  • 天工3.0正式开放!4000亿参数MoE开源,开启音乐生成ChatGPT时刻
  • 今日代码大赏 | 懒汉式单例模式
  • 用 OJ 项目拿下鹅厂,真爽!
  • 跟自己之前的领导聊合作。。
  • 为什么现在的LLM都是Decoder only的架构?
  • 突破数据存储瓶颈!转转业财系统亿级数据存储优化实践
  • QQ 9“傻快傻快”的?!带你看看背后的技术秘密