1、FastDFS介绍
FastDFS是一个轻量级的开源分布式文件系统,主要解决了大容量的文件存储和高并发访问的问题,文件存取时实现了负载均衡,支持存储服务器在线扩容,支持相同内容的文件只保存一份,节约磁盘空间,FastDFS只能通过Client API访问,FastDFS特别适合大中型网站使用,用来存储资源文件(如:图片、文档、音频、视频等等),目前已知支付宝、UC、京东商城、5173等都在使用。
2、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称为存储服务器。
(1)、文件上传流程
客户端发出上传请求,tracker Server接收后查询有哪些Storage可用,调动一个来打算进行存储。接着将这个存储服务器的ip地址跟端口号返回给客户端。客户端的图片就会上传到这个存储服务器。服务器器生成存储信息索引,将上传的图片写到磁盘,并返回索引给客户端。
文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名。比如:
group1
M00/00/01/wKgZhVmoH4OAMlXDAAgxpR8mGTg752.jpg
(2)、文件下载流程
3、java实现文件上传
注:关于服务器的搭建,很长一堆,可以在网上找别人搭建好的(我找的这个名字叫taotao-image-server)。
创建项目,导入fastdfs的jar包(在网上找到这个fastdfs_client项目然后安装到本地仓库)
<dependencies>
<dependency>
<groupId>fastdfs_client</groupId>
<artifactId>fastdfs_client</artifactId>
<version>1.25</version>
</dependency>
</dependencies>
属性配置文件client-properties中写上服务器ip
tracker_server=192.168.25.133:22122
现在传个图片到服务器上
@Test
/*
* 图片上传
*/
public void tesFastDFS() throws Exception{
//1.加载配置文件,写磁盘路径
ClientGlobal.init("D:\\大数据\\FastDFS\\src\\main\\resources\\client.properties");
//2.创建TrackerClient对象
TrackerClient trackerClient = new TrackerClient();
//3.通过trackerClient获得TrackerServer对象
TrackerServer trackerServer = trackerClient.getConnection();
//4.创建StorageServer对象,null值
StorageServer storageServer = null;
//5.创建StorageClient,传入storageServer,clientServer对象
StorageClient storageClient = new StorageClient(trackerServer, storageServer);
//6.通过storageClient对象来实现文件上传,传入三个参数:文件地址,后缀,元素
String[] files = storageClient.upload_file("C:\\Users\\12706\\Desktop\\图片\\411-49401.jpg", "jpg", null);
for (String string : files) {
System.out.println(string);
}
}
控制台输出:
group1
M00/00/01/wKgZhVmoJCGAUCVwAAgxpR8mGTg456.jpg
浏览器访问的话用:ip地址/组名/虚拟磁盘路径/ 数据两级目录/文件名
测试:
4、java实现文件下载
@Test
/*
* 图片下载
*/
public void tesFastDFS2() throws Exception{
//1.加载配置文件,写硬盘路径而不是classpath下路径
ClientGlobal.init("D:\\大数据\\FastDFS\\src\\main\\resources\\client.properties");
//2.创建TrackerClient对象
TrackerClient trackerClient = new TrackerClient();
//3.通过trackerClient获得TrackerServer对象
TrackerServer trackerServer = trackerClient.getConnection();
//4.创建StorageServer对象,null值
StorageServer storageServer = null;
//5.创建StorageClient,传入storageServer,clientServer对象
StorageClient storageClient = new StorageClient(trackerServer, storageServer);
//6.通过storageClient对象来实现文件下载,传入2个参数:组名,虚拟磁盘路径/数据两级目录/文件名
byte[] files = storageClient.download_file("group1", "M00/00/01/wKgZhVmoJCGAUCVwAAgxpR8mGTg456.jpg");
FileOutputStream fileOutputStream = new FileOutputStream(new File("D:\\mumu.jpg"));
fileOutputStream.write(files);
}
测试看刚才上传的文件有没有下载到指定位置:
D:\mumu.jpg
已经成功下载到了指定位置。