原理及下载
什么是fastDFS
fastDFS 是以C语言开发的一项开源轻量级分布式文件系统,他对文件进行管理,主要功能有:文件存储,文件同步,文件访问(文件上传/下载),特别适合以文件为载体的在线服务,如图片网站,视频网站等
什么是文件系统
借用百度百科描述
文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。文件系统由三部分组成:文件系统的接口,对对象操纵和管理的软件集合,对象及属性。从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤销文件等
也就是说文件系统在计算机中的作用是操作系统与硬盘之间的桥梁,他通过驱动来实现文件的存储,文件系统也是属于操作系统的一部分
什么是分布式文件系统
借用百度百科描述
分布式文件系统(Distributed File System,DFS)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点(可简单的理解为一台计算机)相连;或是若干不同的逻辑磁盘分区或卷标组合在一起而形成的完整的有层次的文件系统。DFS为分布在网络上任意位置的资源提供一个逻辑上的树形文件系统结构,从而使用户访问分布在网络上的共享文件更加简便。单独的 DFS共享文件夹的作用是相对于通过网络上的其他共享文件夹的访问点
基于客户端/服务器的文件存储系统
对等特性允许一些系统扮演客户端和服务器的双重角色,可供多个用户访问的服务器,比如,用户可以“发表”一个允许其他客户机访问的目录,一旦被访问,这个目录对客户机来说就像使用本地驱动器一样
通过上面我们简单了解了什么是fastDFS 以及分布式文件系统的概念
下面来看下他的运行原理
FastDFS服务端有两个角色:跟踪器(tracker)和存储节点(storage)。跟踪器主要做调度工作,在访问上起负载均衡的作用。
存储节点存储文件,完成文件管理的所有功能:存储、同步和提供存取接口,FastDFS同时对文件的meta data进行管理。所谓文件的meta data就是文件的相关属性,以键值对(key value pair)方式表示,如:width=1024,其中的key为width,value为1024。文件meta data是文件属性列表,可以包含多个键值对。
FastDFS系统结构如下图所示:
文件上传
文件下载
fastDFS的安装步骤切记要把端口号打开
需要使用他(fastdfs-client-java)来进行与springboot整合
以下的代码时根据fastdfs-client-java 提供的示例代码修改的
代码部分
1.新建一个sringboot 项目在pom.xml中引入依赖
org.csource
fastdfs-client-java
1.29-SNAPSHOT
2.在resources文件夹下创建一个fdfs文件夹,在里面创建一个fastdfs-client.properties
fastdfs.connect_timeout_in_seconds = 5
fastdfs.network_timeout_in_seconds = 30
fastdfs.charset = UTF-8
fastdfs.http_anti_steal_token = false
fastdfs.http_secret_key = FastDFS1234567890
fastdfs.http_tracker_http_port = 80
fastdfs.tracker_servers =tracker服务的地址:22122
3.编写测试类
3.1 测试上传
@Test
void testUpload(){
try {
//加载 fastDFS的配置文件 因为这里使用的是Properties 格式的文件 所以使用initByProperties
ClientGlobal.initByProperties("fdfs/fastdfs-client.properties");
System.out.println("network_timeout=" + ClientGlobal.g_network_timeout + "ms");
System.out.println("charset=" + ClientGlobal.g_charset);
//创建TrackerClient
TrackerClient tracker = new TrackerClient();
TrackerServer trackerServer = tracker.getTrackerServer();
//创建StorageServer
StorageServer storageServer = null;
StorageClient1 client = new StorageClient1(trackerServer, storageServer);
//文件上传的元信息
NameValuePair[] metaList = new NameValuePair[1];
//这里第一个参数随意写,第二个参数是上传文件是命名的文件名
metaList[0] = new NameValuePair("fileName", "1.png");
//第一个参数是本地文件的地址,第一个是文件的后缀名,第三个是元信息
String fileId = client.upload_file1("F:\\code\\1.png", null, metaList);
System.out.println("upload success. file id is: " + fileId);
} catch (Exception ex) {
ex.printStackTrace();
}
}
3.2 测试查看文件
@Test
void testQuery(){
try {
//加载 fastDFS的配置文件
ClientGlobal.initByProperties("fdfs/fastdfs-client.properties");
System.out.println("network_timeout=" + ClientGlobal.g_network_timeout + "ms");
System.out.println("charset=" + ClientGlobal.g_charset);
//创建TrackerClient
TrackerClient tracker = new TrackerClient();
TrackerServer trackerServer = tracker.getTrackerServer();
//创建StorageServer
StorageServer storageServer = null;
StorageClient1 client = new StorageClient1(trackerServer, storageServer);
//执行查询
//两行代码是一样的
//FileInfo fileInfo = client.query_file_info("group1", "M00/00/00/rBGDpV_xZuiAAbtJAAKWrzhZhWU376.png");
FileInfo fileInfo = client.query_file_info1("group1/M00/00/00/rBGDpV_xZuiAAbtJAAKWrzhZhWU376.png");
//查询元信息
NameValuePair[] metadata1 = client.get_metadata1("group1/M00/00/00/rBGDpV_xZuiAAbtJAAKWrzhZhWU376.png");
//NameValuePair[] metadata2 = client.get_metadata("group1","M00/00/00/rBGDpV_xZuiAAbtJAAKWrzhZhWU376.png");
System.out.println(fileInfo);
System.out.println("元信息-----");
System.out.println(metadata1);
} catch (Exception ex) {
ex.printStackTrace();
}
}
3.3 下载文件
@Test
void testDownload(){
try {
//加载 fastDFS的配置文件
ClientGlobal.initByProperties("fdfs/fastdfs-client.properties");
System.out.println("network_timeout=" + ClientGlobal.g_network_timeout + "ms");
System.out.println("charset=" + ClientGlobal.g_charset);
//创建TrackerClient
TrackerClient tracker = new TrackerClient();
TrackerServer trackerServer = tracker.getTrackerServer();
//创建StorageServer
StorageServer storageServer = null;
StorageClient1 client = new StorageClient1(trackerServer, storageServer);
//文件下载
byte[] bytes = client.download_file1("group1/M00/00/00/rBGDpV_xhtOAGem-AAKWrzhZhWU356.png");
//将文件写出
File file = new File("f:/abd.png");
FileOutputStream outputStream = new FileOutputStream(file);
outputStream.write(bytes);
} catch (Exception ex) {
ex.printStackTrace();
}
}
下载成功后
在指定盘符下会找打此文件
3.4 删除文件
@Test
void testDelete(){
try {
//加载 fastDFS的配置文件
ClientGlobal.initByProperties("fdfs/fastdfs-client.properties");
System.out.println("network_timeout=" + ClientGlobal.g_network_timeout + "ms");
System.out.println("charset=" + ClientGlobal.g_charset);
//创建TrackerClient
TrackerClient tracker = new TrackerClient();
TrackerServer trackerServer = tracker.getTrackerServer();
//创建StorageServer
StorageServer storageServer = null;
StorageClient1 client = new StorageClient1(trackerServer, storageServer);
//文件删除
int i = client.delete_file1("group1/M00/00/00/rBGDpV_xhtOAGem-AAKWrzhZhWU356.png");
if(i>=0){
System.out.println("删除成功!");
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
删除成功后
在执行一下查询 发现变成了null
以上就是spring+fastDFS的简单总结了,希望能帮助到大家