SpringBoot整合FastDFS

SpringBoot整合FastDFS


文章目录

  • SpringBoot整合FastDFS
    • @[TOC](文章目录)
  • 前言
    • FastDFS简介:
  • 一、安装FastDFS(使用Dokcer安装)
    • 1. 从镜像库中拉起fastdfs的镜像
    • 2. 运行tracker
    • 3. 运行storage
  • 二、FastDFS相关配置
    • 1. 进入刚刚创建的storage容器
    • 2. 修改nginx配置
    • 3. storage和tracker配置文件(按需修改)
      • storage.conf
      • tracker.conf
  • 三、编写FastDFS案例
    • 1.引入库
    • 2.添加启动配置文件
    • 3.编写文件基础类
      • 上传文件:
      • 文件删除:
      • 下载文件:
    • 4.编写请求
      • 文件上传
      • 文件删除
      • 文件下载
    • 5.效果
      • 文件上传
      • 文件删除
      • 文件下载

前言

FastDFS简介:

  • FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。
  • FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
  • FastDFS 架构包括 Tracker server 和 Storage server。客户端请求 Tracker server
    进行文件上传、下载,通过Tracker server 调度最终由 Storage server 完成文件上传和下载。
  • Tracker server 作用是负载均衡和调度,通过 Tracker server 在文件上传时可以根据一些策略找到Storage server提供文件上传服务。可以将 tracker 称为追踪服务器或调度服务器。Storage server
    作用是文件存储,客户端上传的文件最终存储在 Storage 服务器上,Storage server没有实现自己的文件系统而是利用操作系统的文件系统来管理文件。可以将storage称为存储服务器。

文件上传流程:
SpringBoot整合FastDFS_第1张图片

客户端上传文件后存储服务器将文件 ID 返回给客户端,此文件 ID 用于以后访问该文件的索引信息。文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名。
请添加图片描述

一、安装FastDFS(使用Dokcer安装)

提示:没有安装Docker的可以参考文章
Docker入门(一)

1. 从镜像库中拉起fastdfs的镜像

docker pull morunchang/fastdfs

2. 运行tracker

docker run -d --name tracker --net=host morunchang/fastdfs sh tracker.sh

3. 运行storage

提示:TRACKER_IP务必换成自己的服务器ip

docker run -d --name storage --net=host -e TRACKER_IP=服务器IP:22122 -e GROUP_NAME=group1 morunchang/fastdfs sh storage.sh
  • 使用的网络模式是–net=host,host模式可以不用映射容器端口宿主机, 替换为你机器的IP即可
  • GROUP_NAME是组名,即storage的组
  • 如果想要增加新的storage服务器,再次运行该命令,注意更换 新组名

二、FastDFS相关配置

1. 进入刚刚创建的storage容器

docker exec -it storage /bin/bash

2. 修改nginx配置

vi /etc/nginx/conf/nginx.conf

向nginx.conf配置文件中加入,如果已存在,请略过这一步

location ~ /M00 {
	//数据存储路径
	root /data/fast_data/data;
	ngx_fastdfs_module;
	//禁止缓存
	add_header Cache-Control no-store;
}

修改保存完后退出并重启storage容器

3. storage和tracker配置文件(按需修改)

提示:不了解配置文件请跳过
再次进入storage容器

docker exec -it storage /bin/bash

进入配置文件目录

cd /etc/fdfs

storage.conf

SpringBoot整合FastDFS_第2张图片

tracker.conf

SpringBoot整合FastDFS_第3张图片
提示:如果修改了记得重启容器哦

三、编写FastDFS案例

1.引入库

        <dependency>
            <groupId>com.github.tobatogroupId>
            <artifactId>fastdfs-clientartifactId>
            <version>1.26.7version>
        dependency>

2.添加启动配置文件

fdfs:
  # 链接超时
  connect-timeout: 60
  # 读取时间
  so-timeout: 60
  # 生成缩略图参数
  thumb-image:
    width: 150
    height: 150
  tracker-list: 服务器IP:22122

3.编写文件基础类


上传文件:

@Resource
private FastFileStorageClient storageClient;

public String upload(MultipartFile multipartFile) throws Exception {
	String originalFilename = multipartFile.getOriginalFilename().substring(multipartFile.getOriginalFilename().lastIndexOf(".") + 1);
	StorePath storePath = this.storageClient.uploadImageAndCrtThumbImage(multipartFile.getInputStream(),multipartFile.getSize(), originalFilename, null);
	return storePath.getFullPath();
}

文件删除:

@Resource
private FastFileStorageClient storageClient;

public void deleteFile(String fileUrl) {
        if (StringUtils.isEmpty(fileUrl)) {
            LOGGER.info("fileUrl == >>文件路径为空...");
            return;
        }
        try {
        	//对根据传入的url删除文件
            StorePath storePath = StorePath.parseFromUrl(fileUrl);
            storageClient.deleteFile(storePath.getGroup(), storePath.getPath());
            //删除上传所产生的缩略图
            val split = fileUrl.split("\\.");
            split[0] += "_150x150.";
            String fileUrl2 = split[0] + split[1];
            StorePath storePath2 = StorePath.parseFromUrl(fileUrl2);
            storageClient.deleteFile(storePath2.getGroup(), storePath2.getPath());
        } catch (Exception e) {
            LOGGER.info(e.getMessage());
        }
    }

下载文件:

@Resource
private FastFileStorageClient storageClient;

public byte[] download(String fileUrl) {
	String group = fileUrl.substring(0, fileUrl.indexOf("/"));
	String path = fileUrl.substring(fileUrl.indexOf("/") + 1);
	byte[] bytes = storageClient.downloadFile(group, path, new DownloadByteArray());
	return bytes;
}

4.编写请求


文件上传

//headers必须是form-data否则无法上传文件
@RequestMapping(value = "/uploadFile", headers = "content-type=multipart/form-data", method = RequestMethod.POST)
public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file) {
	String result;
	try {
		String path = fdfsUtil.upload(file);
        if (!StringUtils.isEmpty(path)) {
        	result = path;
        } else {
            result = "上传失败";
        }
	} catch (Exception e) {
		e.printStackTrace();
        result = "服务异常";
    }
    return ResponseEntity.ok(result);
}

文件删除

@RequestMapping(value = "/deleteByPath", method = RequestMethod.GET)
public ResponseEntity<String> deleteByPath(String filePathName) {
	// String filePathName = "group1/M00/00/00/wKhjZF3WEDmAPSglAABSZAhj0eU111.jpg" ;
	fdfsUtil.deleteFile(filePathName);
	return ResponseEntity.ok("SUCCESS");
}

文件下载

@RequestMapping(value = "/download", method = RequestMethod.GET)
public void download(String fileUrl, HttpServletResponse response, HttpServletRequest request) throws Exception {
	byte[] data = fdfsUtil.download(fileUrl);
    response.setCharacterEncoding("UTF-8");
    response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode("下载文件名.jpg", "UTF-8"));
    // 写出
    ServletOutputStream outputStream = response.getOutputStream();
    IOUtils.write(data, outputStream);
}

5.效果

文件上传

SpringBoot整合FastDFS_第4张图片

我们进入容器,进入数据储存路径/data/fast_data/data,根除返回url中的两级目录可以看到刚刚上传的图片


SpringBoot整合FastDFS_第5张图片

文件删除

SpringBoot整合FastDFS_第6张图片

删除成功后再次访问文件夹,就可以看到文件已经删除


文件下载

SpringBoot整合FastDFS_第7张图片

http://127.0.0.1:9004/download?fileUrl=group1/M00/00/00/wKjcgWJfKZCAdnKnAAFyuc8FC0I654.jpg

当我们访问/download?fileUrl=xxx,就会指定发起下载

你可能感兴趣的:(SpringBoot,nginx,spring,docker,spring,boot,分布式)