标签
存储
字数
964 字
阅读时间
5 分钟
一、概述
FastDFS是用c语言编写的一款开源的分布式文件系统。FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
1.1 上传流程
fastdfs包含tracker和storage ,storage定时向tracker上传状态信息,文件上传时,客户端先对tracker请求,由teacker查询可用的storage,然后将期ip和端口返回,在由客户端上传文件,storage接收生成fileid、写入磁盘,而后返回fileid及路径信息、文件名给客户端
客户端上传文件后存储服务器将文件ID返回给客户端,此文件ID用于以后访问该文件的索引信息。文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名。
组名:文件上传后所在的storage组名称,在文件上传成功后有storage服务器返回,需要客户端自行保存。
虚拟磁盘路径:storage配置的虚拟路径,与磁盘选项store_path*对应。如果配置了store_path0则是M00,如果配置了store_path1则是M01,以此类推。
数据两级目录:storage服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件。
文件名:与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含:源存储服务器IP地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息。
1.2 下载流程
storage定时向tracker上传状态信息,文件下载时,客户端先对tracker请求,由teacker查询可用的storage,然后将期ip和端口返回,在由客户端通过fileid请求storage,storage查找文件,返回filecontent
二、使用Demo
2.1 与springboot整合
依赖
xml
<dependency>
<groupId>net.oschina.zcx7878</groupId>
<artifactId>fastdfs‐client‐java</artifactId>
</dependency>配置
yml
server:
port: 22100
spring:
application:
name: xc‐service‐base‐filesystem
#mongo配置
data:
mongodb:
database: xc_fs
uri: mongodb://root:123@127.0.0.1:27017
#SpringMVC上传文件配置
servlet:
multipart:
#默认支持文件上传.
enabled: true
#支持文件写入磁盘.
file‐size‐threshold: 0
# 上传文件的临时目录
location:
# 最大支持文件大小
max‐file‐size: 1MB
# 最大支持请求大小
max‐request‐size: 30MB
xuecheng:
fastdfs:
connect_timeout_in_seconds: 5
network_timeout_in_seconds: 30
charset: UTF‐8
tracker_servers: 192.168.101.64:22122代码实现
java
@Service
public class FileSystemService {
private static final Logger LOGGER = LoggerFactory.getLogger(FileSystemService.class);
@Value("${xuecheng.fastdfs.tracker_servers}")
String tracker_servers;
@Value("${xuecheng.fastdfs.connect_timeout_in_seconds}")
int connect_timeout_in_seconds;
@Value("${xuecheng.fastdfs.network_timeout_in_seconds}")
int network_timeout_in_seconds;
@Value("${xuecheng.fastdfs.charset}")
String charset;
@Autowired
FileSystemRepository fileSystemRepository;
//加载fdfs的配置
private void initFdfsConfig(){
try {
ClientGlobal.initByTrackers(tracker_servers);
ClientGlobal.setG_connect_timeout(connect_timeout_in_seconds);
ClientGlobal.setG_network_timeout(network_timeout_in_seconds);
ClientGlobal.setG_charset(charset);
} catch (Exception e) {
e.printStackTrace();
//初始化文件系统出错
ExceptionCast.cast(FileSystemCode.FS_INITFDFSERROR);
}
}
//上传文件
public UploadFileResult upload(MultipartFile file,
String filetag, String businesskey, String metadata){
if(file == null){
ExceptionCast.cast(FileSystemCode.FS_UPLOADFILE_FILEISNULL);
}
//上传文件到fdfs
String fileId = fdfs_upload(file);
//创建文件信息对象
FileSystem fileSystem = new FileSystem();
//文件id
fileSystem.setFileId(fileId);
//文件在文件系统中的路径
fileSystem.setFilePath(fileId);
//业务标识
fileSystem.setBusinesskey(businesskey);
//标签
fileSystem.setFiletag(filetag);
//元数据
if(StringUtils.isNotEmpty(metadata)){
try {
Map map = JSON.parseObject(metadata, Map.class);
fileSystem.setMetadata(map);
} catch (Exception e) {
e.printStackTrace();
}
}
//名称
fileSystem.setFileName(file.getOriginalFilename());
//大小
fileSystem.setFileSize(file.getSize());
//文件类型
fileSystem.setFileType(file.getContentType());
fileSystemRepository.save(fileSystem);
return new UploadFileResult(CommonCode.SUCCESS,fileSystem);
}
//上传文件到fdfs,返回文件id
public String fdfs_upload(MultipartFile file) {
try {
//加载fdfs的配置
initFdfsConfig();
//创建tracker
client TrackerClient trackerClient = new TrackerClient();
//获取trackerServer
TrackerServer trackerServer = trackerClient.getConnection();
//获取storage
StorageServer storeStorage = trackerClient.getStoreStorage(trackerServer);
//创建storage
client StorageClient1 storageClient1 = new StorageClient1(trackerServer,storeStorage);
//上传文件
//文件字节
byte[] bytes = file.getBytes();
//文件原始名称
String originalFilename = file.getOriginalFilename();
//文件扩展名
String extName = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
//文件id
String file1 = storageClient1.upload_file1(bytes, extName, null);
return file1;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}三、安装
TODO