FastDFS上传文件示例
FastDFS介绍
1. 简介
FastDFS 是用 c 语言编写的一款开源的分布式文件系统,拥有冗余备份、负载均衡、线性扩容等机制,使用 FastDFS 可以提供文件上传、下载等服务。
2. 负载均衡和冗余备份
FastDFS 中包括 Tracker server 和 Storage Server。Tracker Server 的作用是负载均衡和调度,我们在上传文件的时候,TrackerServer 根据一定的策略找到可用的 storage Server,具体的上传下载等操作由 Storage Server 来完成。
Storage Server 的作用是文件存储,客户端上传的文件最终存储在 Storage 服务器上,Storage Server 使用的是操作系统的文件系统来管理文件。Storage 集群分为多个组,每个组之间存储的内容是不同的,但是每个组内存储的内容是相同,这样就实现了冗余备份。
3. 线性扩容
FastDFS 扩容分为两种:横向扩容和竖向扩容。横向扩容指新增一个 Storage 组,竖向扩容指在同一个组中增加服务器。一个 FastDFS系统 的存储容量等于所有组的存储容量之和,但是每一个组的存储容量取决于存储容量最小的服务器,所以同一个组中的存储容量要大致相等,否则会造成空间浪费。
上传文件示例
1. 上传文件的流程
① 初始化链接信息
② 创建一个Tracker客户端,目的是为了链接Tracker获取TrackerServer对象
③ 通过 TrackerServer 创建一个 Storage客户端 对象,该对象的作用是操作Storage
④ 通过Storage客户端实现文件上传
⑤ 获取文件上传信息
明白了上传文件的步骤,接下来就可以写代码来上传文件了。
1) 首先上传文件要依赖 FastDFS 客户端 jar 包。
*仓库中并没有收录 FastDFS 客户端的 jar 包,所以需要手动将 jar 包安装到本地仓库中。
mvn install:install-file -DgroupId=org.csource.fastdfs -DartifactId=fastdfs -Dversion=1.2 -Dpackaging=jar -Dfile=d:\setup\fastdfs_client_v1.20.jar
2)在 pom 文件中引入 jar 包的坐标
<dependencies>
<dependency>
<groupId>org.csource.fastdfs</groupId>
<artifactId>fastdfs</artifactId>
</dependency>
</dependencies>
3)将连接信息写入配置文件中
4)根据上传文件的步骤写代码
/**
* 实现FastDFS文件上传
* @param confFilename:链接tracker的配置文件全路径
* @param fileName:上传文件的全路径
* @return:地址信息
*/
public static String[] upload(String confFilename,String fileName) throws Exception {
confFilename = getConfig(confFilename);
fileName = getConfig(fileName);
// 1.初始化链接信息
ClientGlobal.init(confFilename);
// 2.创建一个Tracker客户端,目的是为了链接Tracker获取TrackerServer对象
TrackerClient trackerClient = new TrackerClient();
TrackerServer trackerServer = trackerClient.getConnection();
// 3.通过TrackerServer创建一个Storage客户端对象,该对象的作用是操作Storage
StorageClient storageClient = new StorageClient(trackerServer,null);
// 4.通过Storage客户端实现文件上传
String[] address = storageClient.upload_file(fileName, null, null);
// 5.获取文件上传信息
return address;
}
public static String getConfig(String path){
if (path.startsWith("classpath:")){
path = path.replace("classpath:",UploadUtils.class.getResource("/").getPath());
}
return path;
}
上传成功,会将地址返回:
2. 下载文件的流程