目录
FastDFS简介
部署FastDFS
Springboot demo
fastdfs简介
FastDFS是一个开源的分布式文件系统,对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。
FastDFS服务端有两个角色:跟踪器(tracker)和存储节点(storage),跟踪器主要做调度工作,在访问上起负载均衡的作用;存储节点存储文件,完成文件管理的所有功能,包括存储、同步和提供存取接口。
FastDFS中的文件标识分为两个部分:卷名和文件名,二者缺一不可。
FastDFS系统架构图:

上传文件交互过程:
client询问tracker上传到的storage,不需要附加参数;
tracker返回一台可用的storage;
client直接和storage通讯完成文件上传。
下载文件交互过程:
client询问tracker下载文件的storage,参数为文件标识(卷名和文件名);
tracker返回一台可用的storage;
client直接和storage通讯完成文件下载。
上述内容摘自:https://www.oschina.net/p/fastdfs?hmsr=aladdin1e1
部署FastDFS
在docker官方仓库中有很多fastdfs镜像,本例以delron/fastdfs 镜像作为参考,并进行部署使用;
在服务器data目录下新建文件夹存储文件
mkdir -p /data/fastdfs/storagemkdir -p /data/fastdfs/tracker
拉取镜像,并启动fastdfs的tracker节点和storage节点
docker pull delron/fastdfs#启动tracker节点,并暴露22122端口docker run -d --name tracker -p 22122:22122 -v /data/fastdfs/tracker:/var/fdfs delron/fastdfs tracker#启动storage节点,指定tracker服务器地址和储存卷名称docker run -d --name storage --net=host -e TRACKER_SERVER=192.168.1.1:22122 -e GROUP_NAME=group1 -v /data/fastdfs/storage:/var/fdfs delron/fastdfs storage
启动成功后,可以到容器中测试上传文件功能
#进入storage容器docker exec -it storage bash# 使用(/usr/bin/fdfs_upload)命令,并指定client配置文件(/etc/fdfs/client.conf),以及要上传的文件(1.txt)/usr/bin/fdfs_upload_file /etc/fdfs/client.conf 1.txt#上传成功后,输出结果:group1/M00/00/00/wKgH_WAT7qmAFw8kAAAACM_m2yg016.txt
上传成功后,在浏览器中输入下面地址,即可下载1.txt文件
http://192.168.1.1:8888/group1/M00/00/00/wKgH_WAT7qmAFw8kAAAACM_m2yg016.txt
Springboot demo
1、在pom.xml文件中引入jar包
<dependency><groupId>com.github.tobato</groupId><artifactId>fastdfs-client</artifactId><version>1.27.2</version></dependency>
2、在application.yml配置文件中添加配置
fdfs:so-timeout: 6000connect-timeout: 6000network-timeout: 3000tracker-list: 192.168.1.1:22122
3、写个连接fastdfs的客户端
@Componentpublic class FastDFSClient {@Autowiredprivate FastFileStorageClient fastFileStorageClient;/*** 上传文件* @param file* @return* @throws IOException*/public StorePath upload(MultipartFile file) {StorePath storePath = null;try {FastFile fastFile = new FastFile.Builder().toGroup("group1").withFile(file.getInputStream(), file.getSize(), FilenameUtils.getExtension(file.getOriginalFilename())).build();storePath = fastFileStorageClient.uploadFile(fastFile);} catch (IOException e) {e.printStackTrace();}return storePath;}/*** 文件下载* @param path 文件路径,例如:/group1/path=M00/00/00/1.txt* @param filename 下载的文件命名* @return*/public void download(String path, String filename, HttpServletResponse response) throws IOException {StorePath storePath = StorePath.parseFromUrl(path);if (StringUtils.isBlank(filename)) {filename = FilenameUtils.getName(storePath.getPath());}byte[] bytes = fastFileStorageClient.downloadFile(storePath.getGroup(), storePath.getPath(), new DownloadByteArray());response.reset();response.setContentType("applicatoin/octet-stream");response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, DEFAULT_CHARSET));ServletOutputStream out = response.getOutputStream();out.write(bytes);out.close();}}
4、接下来调用接口,上传文件即可
@RestController@RequestMapping(value = "/test")public class TextController {@Autowiredprivate FastDFSClient fastDFSClient;@PostMapping(value = "/upload")public void saveSpace(@RequestParam(value="file",required=false) MultipartFile file){fastDFSClient.upload(file);}}
推荐阅读:




