Skip to content
标签
存储
字数
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