FastDFS文件管理知识点+案例分析

news2025/1/23 17:46:38

一 介绍FastDFS 原理

        FastDFS开源分布式文件系统由C语言编写实现, 可以通过专有API访问,目前提供了C、Java和PHP API。

        FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。

二 FastDFS 工作原理

通过原理图,我们可知道有以下组件构成:

1、 tracker server跟踪服务器,主要做调度工作,在访问上起负载均衡的作用。记录storage server的状态,是连接Client和storage server的枢纽。

2、 storage server存储服务器(存储节点或数据服务器),文件和meta data都保存到该存储服务器上。

3、 group(volume)组,也可以称为卷,group是相对storage server而言的,即资源存放地,一个组可以有多个storage server,且数据相互备份。同组内服务器上的文件是完全相同的。

4、 meta data文件相关属性,以键值对方式存储。

5、 client:客户端,作为业务请求的发起方,通过专有接口(API),使用TCP/IP协议与跟踪服务器或存储服务器进行数据交互。

和tomcat相比,有哪些优点?

FastDFS相比于Tomcat :不存在单点故障问题、支持容灾。

FastDFS相比于Tomcat:集群 (安全) 保存图片过多时 扩容   分配合理   。

FastDFS相比于Tomcat: 具有备份功能、不怕磁盘损坏。

三 集成spring

3.1 编写工具类FastDFS.java,代码如下:

package com.utils;


import org.apache.commons.io.FilenameUtils;
import org.csource.common.NameValuePair;
import org.csource.fastdfs.ClientGlobal;
import org.csource.fastdfs.StorageClient1;
import org.csource.fastdfs.TrackerClient;
import org.csource.fastdfs.TrackerServer;
import org.springframework.core.io.ClassPathResource;

/**
 * fastDFS文件上传工具类
 *
 */
public class FastDFSUtils {
	
	

	/**
	 * 
	 * @param pic     	byte数组类型文件
	 * @param fileName	文件名称
	 * @param size		文件大小
	 * @return
	 * @throws Exception
	 */
	public static String uploadFile(byte[] pic, String fileName, long size) throws Exception {
		//1. 设置管理节点ip和端口
		ClassPathResource resource = new ClassPathResource("fdfs_client.conf");
		ClientGlobal.init(resource.getClassLoader().getResource("fdfs_client.conf").getPath());
		//2. 创建和管理节点的对象
		TrackerClient trackerClient = new TrackerClient();
		//3. 获取管理节点连接
		TrackerServer connection = trackerClient.getConnection();
		//4. 创建存储节点, 第一个参数, 传入管理节点连接, 第二个参数为null, 无用的
		StorageClient1 storageClient = new StorageClient1(connection, null);
		//5. 获取上传文件的扩展名称
		String ext = FilenameUtils.getExtension(fileName);
		
		//6. 创建文件的属性对象
		NameValuePair[] meta_list = new NameValuePair[3];
		meta_list[0] = new NameValuePair("fileName", fileName);
		meta_list[1] = new NameValuePair("fileExt", ext);
		meta_list[2] = new NameValuePair("fileSize", String.valueOf(size));
		
		//7. 上传并返回图片地址
		String path = storageClient.upload_file1(pic, ext, meta_list);
		System.out.println("上传并返回图片地址为:"+path);
		return path;
	}
	/**
	 * 删除文件
	 * path:	group1/M00/00/38/DEwSsFoSQfWAFuXeAAMfubPUZ-U666.jpg
	 */
	public static void deleteFile(String path){
		try {
			//1. 设置管理节点ip和端口
			ClassPathResource resource = new ClassPathResource("fdfs_client.conf");
			ClientGlobal.init(resource.getClassLoader().getResource("fdfs_client.conf").getPath());
			//2. 创建和管理节点的对象
			TrackerClient trackerClient = new TrackerClient();
			//3. 获取管理节点连接
			TrackerServer connection = trackerClient.getConnection();
			//4. 创建存储节点, 第一个参数, 传入管理节点连接, 第二个参数为null, 无用的
			StorageClient1 storageClient = new StorageClient1(connection, null);
			int i = storageClient.delete_file1(path);
			System.out.println("删除图片的结果为:"+i);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
}

3.2 修改配置文件fdfs_client.conf,修改url以及端口号,找运维要

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/894923.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

scala中json4s 使用详解

预备知识 json4s的数据结构AST (Abstract Syntax Tree)。 sealed abstract class JValue case object JNothing extends JValue // zero for JValue case object JNull extends JValue case class JString(s: String) extends JValue case class JDouble(num: Double) extend…

企业需求如何精准对接科研院校科技成果?

一系列科技成果转化相关政策、法律法规的出台,正在破除高校科技成果转化机制上的桎梏。企业科技创新的需求也越来越大,也充分意识到与高校合作对于推动企业发展的重要性,对接科技成果的热情高涨,合作越来越频繁。但是也存在不成功…

SpringBoot 的 RedisTemplate、Redisson

一、Jedis、Lettuce、Redisson的简介 优先使用Lettuce, 需要分布式锁,分布式集合等分布式的高级特性,添加Redisson结合使用。 对于高并发,1000/s的并发,数据库可能由行锁变成表锁,性能下降会厉害。 1.1、…

linux中ubuntu安装hashcat方法以及使用GPU破解

一、linux安装hashcat git clone https://github.com/hashcat/hashcat.git make make install二、安装驱动 驱动版本安装大全:https://developer.nvidia.com/cuda-toolkit-archive 查看自己显卡选择对应的版本,根据下面命令无脑安装就行了 wget https:/…

誉天华为数通Datacom HCIE认证课程

作为当前网络领域最具含金量的认证之一,华为Datacom HCIE认证不仅是网络工程师们技术能力的证明,也是未来行业趋势的风向标。 尽管经历了几度版本更迭、考题变化,但是誉天一直紧跟技术发展趋势,在专业领域和教学内容上始终与当前的…

生成国密密钥对

在线生成国密密钥对 生成的密钥对要妥善保管,丢失是无法找回的。

奇迹MU服务端IGC架设流程

奇迹MU服务端IGC架设流程 大家好我是艾西,今天跟大家简单聊下奇迹IGC服务端。IGC端是国外的东西全英文大家感兴趣的话也可以自己研究研究,整体的东西还是非常完整。扩展以及端的稳定性还是非常不错的就是有点费脑子........(此教程为个人娱乐…

WebStorm运行vue项目

WebStorm运行vue项目(vue2) 1.安装webstorm 2. 需要安装node.js 环境,可以去官网下载 https://nodejs.org/en 3. 安装完需要查看 按winr 输入cmd进入 输入命令node -v 和npm -v 查看,会出现相应的版本号,代表安装成功 vue官网安…

IC设计中主要的EDA工具有哪些? (内附EDA虚拟机安装资源)

EDA工具的使用涵盖了芯片的功能设计、综合、验证、物理设计等环节,更是被称作“芯片设计的工作母机”。下面就来为大家具体介绍一下常见的EDA工具。(需要EDA虚拟机安装资源文末可领取~) 什么是EDA? EDA是电子设计自动化&#xf…

对象存储服务-MinIO基本集成

是什么 MinIO 是一个高性能的分布式对象存储服务,适合存储非结构化数据,如图片,音频,视频,日志等。对象文件最大可以达到5TB。 安装启动 mkdir -p /usr/local/minio cd /usr/local/minio# 下载安装包 wget https:/…

NextJs - Error Handling (错误处理)

Error.js 的作用 使用 error.js 文件规则,可以优雅地处理嵌套路由中的意外运行时错误。 在 React Error Boundary 中自动封装路由段及其嵌套子段。 使用文件系统层次结构来调整粒度,为特定网段量身定制错误 UI。 将错误隔离到受影响的网段&#xff0…

红帆OA SQL注入漏洞复现

0x01 产品简介 红帆iOffice.net从最早满足医院行政办公需求(传统OA),到目前融合了卫生主管部门的管理规范和众多行业特色应用,是目前唯一定位于解决医院综合业务管理的软件,是最符合医院行业特点的医院综合业务管理平…

怎么修改图片的分辨率?

怎么修改图片的分辨率?很多人还不知道分辨率是什么意思,以为代表了图片的清晰度,然而并不是这样的,其实图片的分辨率就是图片尺寸大小的意思。修改图片的分辨率即改变图片的尺寸,通常以像素为单位表示。分辨率决定了图…

【腾讯云Cloud Studio实战训练营】使用Cloud Studio社区版快速构建React完成点餐H5页面还原

陈老老老板🦸 👨‍💻本文专栏:生活(主要讲一下自己生活相关的内容) 👨‍💻本文简述:生活就像海洋,只有意志坚强的人,才能到达彼岸。 👨‍💻上一篇…

如何优雅做好项目管理?

导言 项目本身无好坏之分,项目管理有做好与做坏之别。在互联网大厂的体制下,想要做坏一个项目很难(可以通过换人、追加资源等方式消除风险),想要做好一个项目不容易,需要团队及PM付出大量心血和精力。在这…

实时业务需求和数据处理要求的满足:流处理的能力

随着数据量和数据种类的不断增加,企业和组织对于实时数据处理和业务响应的需求也越来越迫切。传统的批处理方式无法满足业务对于实时性和即时响应的要求,因此,流处理技术应运而生。通过流处理能力,可以有效地处理实时数据&#xf…

Python爬虫常用:谷歌浏览器驱动——Chromedriver 插件安装教程

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 我们在做爬虫的时候经常要使用谷歌浏览器驱动,今天分享下这个Chromedriver 插件的安装方法。 话不多说,直接开搞,如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码 第一步、打开谷…

VR仿真实训系统编辑平台赋予老师更多自由和灵活性

为了降低院校教师在VR虚拟现实方面应用的门槛,VR公司深圳华锐视点融合多年的VR虚拟仿真实训系统制作经验,制作了VR动物课件编辑器,正在逐渐受到师生们的关注和应用。 简单来说,VR畜牧专业课件编辑器是一种可以制作虚拟现实动物教学…

【LeetCode】696 . 计数二进制子串

696 . 计数二进制子串(简单) 思路 我们可以将字符串按照 0 和 1 的连续段分组,存在 count 数组中。例如 00111011 可以得到:count {2,3,1,2}。这里 count 数组中两个相邻的数一定代表的是两种不同的字符。假设 count 数组中两个相…

vue3生成点选验证码,前端校验

先看效果图 verify.vue&#xff1a;源码{用时一天半的破轮子}&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; <template><div class"outside" ref&q…