当前位置: 首页 > news >正文

fastdfs简介及在springboot中使用

fastdfs简介及在springboot中使用

  • fastdfs简介
    • storage server
    • tracker server
  • 文件上传
  • 在springboot使用fastdfs
    • fastdfs依赖
    • fastdfs配置
    • controller

fastdfs简介

fastdfs是一个开源的轻量级分布式文件系统,
提供了文件上传、文件下载、文件同步、文件存储等功能,
解决了大容量存储和负载均衡的问题,适合以中小文件为载体的在线服务。

由跟踪服务器tracker server、存储服务器storage server组成,
客户端请求tracker server进行文件上传、下载,tracker server调度storage server完成文件存储。

storage server

简称storage,以卷volume为单位组织,
卷与卷之间的文件是不同的,实现了分布式存储,
一卷可以由一台或多台storage组成,每台storage的文件是相同的,起到了冗余和负载均衡的作用,
当存储空间不足时,可以动态添加卷,这样就扩大了系统的容量。

tracker server

简称tracker,tracker是fastdfs的协调者,负责调度所有的storage,storage启动会连接tracker,
告知自己所属的volume等信息,
并一直保持心跳。

tracker可以扩展为tracker cluster集群服务,
cluster中每个tracker都是完全对等的,
客户端在upload时可以在集群中任意选择一个tracker。
在这里插入图片描述

文件上传

文件上传流程:
在这里插入图片描述
当tracker收到客户端的upload请求时,会按照一定的策略分配一个卷volume,

选定volume后,tracker会在volume中选择一个storage返回给客户端,

客户端向storage发送upload请求,storage会为文件分配一个目录,即虚拟磁盘,
虚拟磁盘下有两级256*256的目录,
storage选择一个两级目录,
并为文件生成一个fileID作为文件名存储在该两级目录下。
在这里插入图片描述

在springboot使用fastdfs

fastdfs依赖

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>

fastdfs配置

application.properties中添加,要换成自己的fastdfsIP,

fdfs.connect-timeout=60
fdfs.thumb-image.width=300
fdfs.thumb-image.height=300
fdfs.tracker-list=fastdfsIP:22122

controller

package com.example.duohoob.controller;

import java.net.URLEncoder;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import com.github.tobato.fastdfs.domain.fdfs.StorePath;
import com.github.tobato.fastdfs.domain.proto.storage.DownloadByteArray;
import com.github.tobato.fastdfs.service.FastFileStorageClient;

/**
 * @author yangwei
 * @date 2022年10月13日
 */
@RestController
@RequestMapping("/fastDFS")
public class FastDFSController {

	@Autowired
	private FastFileStorageClient fastFileStorageClient;
	
	@RequestMapping("/upload")
	public String upload(MultipartFile file) throws Exception {
		String originalFilename = file.getOriginalFilename();
		String fileName = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
		StorePath storePath = fastFileStorageClient.uploadFile(file.getInputStream(), file.getSize(), fileName, null);
		String fullPath = storePath.getFullPath();
		return fullPath;
	}
	
	@RequestMapping("/download")
	public void download(String fullPath, HttpServletRequest request, HttpServletResponse response) throws Exception {
		int index = fullPath.indexOf("/");
		String groupName = fullPath.substring(0, index);
		String path = fullPath.substring(index + 1);
		byte[] bytes = fastFileStorageClient.downloadFile(groupName, path, new DownloadByteArray());
		response.setCharacterEncoding("UTF-8");
		response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode("下载文件名.jpg", "UTF-8"));
		ServletOutputStream outputStream = response.getOutputStream();
		IOUtils.write(bytes, outputStream);
	}
	
}

相关文章:

  • OpenCASCADE使用(Stp to Gltf)
  • 进程互斥的硬件实现方式【操作系统学习笔记】
  • JavaScript教程-原生的原型,Object.prototype,其他的内建原型,从原型当中借用,原型方法,_proto_
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • 基于微信小程序的数码商城程序设计与实现(后台PHP+Mysql)
  • FA_06.不用刷机情况下升级或者降级系统中的fridaserver
  • 【笔试题】【day3】
  • 微信小程序|基于小程序实现人脸识别对比
  • [附源码]Java计算机毕业设计SSMJava商场会员管系统
  • 多模态学习、迁移学习、元学习、联邦学习、表示学习、知识图谱、无监督学习、半监督学习、弱监督学习、自监督学习简介
  • 剑指offer 63. 和为S的两个数字
  • 【VUE基础】webpack
  • 机器人轨迹规划中经常用到的曲线特性小结:Cn连续与Gn连续、Frenet标架、曲率和挠率
  • 【深度学习】卷积神经网络CNN入门介绍
  • Android Studio 提示:更新 TKK 失败,请检查网络连接
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • android 一些 utils
  • Android框架之Volley
  • ERLANG 网工修炼笔记 ---- UDP
  • HashMap ConcurrentHashMap
  • Hibernate【inverse和cascade属性】知识要点
  • interface和setter,getter
  • iOS 系统授权开发
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • JavaScript 基本功--面试宝典
  • javascript数组去重/查找/插入/删除
  • Magento 1.x 中文订单打印乱码
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • vue中实现单选
  • 跳前端坑前,先看看这个!!
  • 为视图添加丝滑的水波纹
  • 用jquery写贪吃蛇
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 阿里云服务器如何修改远程端口?
  • ​用户画像从0到100的构建思路
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • # 安徽锐锋科技IDMS系统简介
  • #{}和${}的区别?
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (4)STL算法之比较
  • (HAL库版)freeRTOS移植STMF103
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (强烈推荐)移动端音视频从零到上手(下)
  • (四)Controller接口控制器详解(三)
  • (四)linux文件内容查看
  • (图)IntelliTrace Tools 跟踪云端程序
  • (一)Mocha源码阅读: 项目结构及命令行启动