图片上传下载。分布式文件系统FastDFS详情介绍

简介: java实现文件上传

1.FastDFS概述

FastDFS是一个开源的轻量级分布式文件系统。它解决了大数据量存储和负载均衡等问题。特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务,如相册网站、视频网站等等。

2.FastDFS特性

  • 文件不分块存储,上传的文件和OS文件系统中的文件一一对应
  • 支持相同内容的文件只保存一份,节约磁盘空间
  • 下载文件支持HTTP协议,可以使用内置Web Server,也可以和其他Web Server配合使用
  • 支持在线扩容
  • 支持主从文件

3.FastDFS核心概念

image.png

FastDFS服务端有三个角色:跟踪服务器(tracker)、存储服务器(storage)和客户端(client)。


tracker


跟踪服务器,主要做调度工作,起负载均衡的作用。在内存中记录集群中所有存储组和存储服务器的状态信息,是客户端和数据服务器交互的枢纽。


client


客户端,作为业务请求的发起方,通过专有接口,使用TCP/IP协议与跟踪器服务器或存储节点进行数据交互。FastDFS向使用者提供基本文件访问接口,比如upload、download、append、delete等,以客户端库的方式提供给用户使用。


group


组, 也可称为卷。 同组内服务器上的文件是完全相同的 ,同一组内的storage server之间是对等的, 文件上传、 删除等操作可以在任意一台storage server上进行 。

4.FastFDS上传机制

image.png

首先客户端请求Tracker服务获取到存储服务器的ip地址和端口,然后客户端根据返回的IP地址和端口号请求上传文件,存储服务器接收到请求后生产文件,并且将文件内容写入磁盘并返回给客户端file_id、路径信息、文件名等信息,客户端保存相关信息上传完毕。

image.png

内部流程:


(1)选择Tracker server


当集群中不止一个Tracker server时,由于Tracker之间是完全对等的关系,客户端在upload文件时可以任意选择一个trakcer。


(2)选择Storage Server


当选定Group后,Tracker会在Group内选择一个Storage Server给客户端。


(3)选择Storage path


当分配好Storage Server后,客户端将向Storage发送写文件请求,Storage将会为文件分配一个数据存储目录。


注意:剩余存储空间最多的优先。

(4)生成Fileid


选定存储目录之后,Storage会为文件生一个Fileid,由Storage Server Ip、文件创建时间、文件大小、文件crc32和一个随机数拼接而成,然后将这个二进制串进行base64编码,转换为可打印的字符串。


(5)生成文件名


当文件存储到某个子目录后,即认为该文件存储成功,接下来会为该文件生成一个文件名,文件名由group、存储目录、两级子目录、fileid、文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成。


5.FastFDS下载机制

客户端带上文件名信息请求Tracker服务获取到存储服务器的ip地址和端口,然后客户端根据返回的IP地址和端口号请求下载文件,存储服务器接收到请求后返回文件给客户端。

image.png

内部流程:

(1)client询问tracker下载文件的storage,参数为文件标识(组名和文件名)。

(2)tracker返回一台可用的storage。

(3)client直接和storage通讯完成文件下载。

6.Spring Boot整合FastFDS

(1)导入pom文件依赖。

<dependency><groupId>com.github.tobato</groupId><artifactId>fastdfs-client</artifactId><version>1.26.5</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>

(2)编写Spring Boot入口类。

packagecom.demo;
importcom.github.tobato.fastdfs.FdfsClientConfig;
importorg.springframework.boot.SpringApplication;
importorg.springframework.boot.autoconfigure.SpringBootApplication;
importorg.springframework.context.annotation.EnableMBeanExport;
importorg.springframework.context.annotation.Import;
importorg.springframework.jmx.support.RegistrationPolicy;
//===================================================================//获取带有连接池的FastDFS Java客户端@Import(FdfsClientConfig.class)
// 解决jmx重复注册bean的问题@EnableMBeanExport(registration=RegistrationPolicy.IGNORE_EXISTING)
//===================================================================@SpringBootApplicationpublicclassFastdfsSpringbootDriverApplication {
publicstaticvoidmain(String[] args) {
SpringApplication.run(FastdfsSpringbootDriverApplication.class, args);
   }
}

(3)配置application.yml文件。

===================================================================#分布式文件系统FDFS配置===================================================================fdfs:
so-timeout: 1501connect-timeout: 601thumb-image:       #缩略图生成参数width: 150height: 150tracker-list:       #TrackerList参数,支持多个#服务器地址+端口号,默认22122-127.0.0.1:22122

(4)上传文件方法。

@RestController@RequestMapping("/upload")
publicclassUoloadToFastDFSController {
//fastdfs存储节点的客户端对象@AutowiredprivateFastFileStorageClientfastFileStorageClient;
@PostMapping("/upload")
publicvoiduploadMoreImage(MultipartFile[] files){
//判断是否上传图片if(files!=null&&files.length!=0 ){
//遍历上传图片for (MultipartFilemultipartFile : files) {
//获取上传文件名Stringfilename=multipartFile.getOriginalFilename();
//获取最后一个“.”的下标,并获取从这个下标的下一个下标开始后的字符作为文件后缀StringfileSuffix=filename.substring(filename.lastIndexOf(".") +1);
StorePathstorePath=null;
try {
//上传文件//文件上传:参数一:传输文件内容的输入流;参数二:文件的size;参数三:文件扩展名;参数四:描述文件的元数据;返回值:上传文件在存储节点的唯一标识(卷名+文件名)storePath=fastFileStorageClient.uploadFile(multipartFile.getInputStream(), multipartFile.getSize(), fileSuffix, null);
         } catch (IOExceptione) {
e.printStackTrace();
         }
//打印返回的文件在存储节点的唯一标识System.out.println(storePath.getFullPath());
       }
     }
   }
}

(5)文件下载方法。

/*** 测试springboot环境下的javaAPI对分布式文件系统的下载文件的操作* @throws IOException*/@TestpublicvoidtestDownload() throwsIOException {
//下载文件:参数一:文件处于存储节点的卷名;参数二:文件在存储节点的文件名;参数三:下载的回调函数;返回值:文件内容的字节数组byte[] bytes=fastFileStorageClient.downloadFile("group1", "M00/00/00/wKhCZWICJcqAftV0AAChCwXlPdE133.jpg", newDownloadByteArray());
//创建文件输出流,指定输出位置及文件名FileOutputStreamfileOutputStream=newFileOutputStream("d:\\mei.jpg");
//使用文件输出流将文件内容字节数组写出fileOutputStream.write(bytes);
//刷新输出流fileOutputStream.flush();
//关闭输出流fileOutputStream.close();
   }
相关文章
|
19天前
|
存储 Oracle 关系型数据库
分布式事物【Seata实现、下载启动Seata服务、搭建聚合父工程构建】(四)-全面详解(学习总结---从入门到深化)
分布式事物【Seata实现、下载启动Seata服务、搭建聚合父工程构建】(四)-全面详解(学习总结---从入门到深化)
51 0
|
19天前
|
Java 数据库连接 mybatis
分布式事物【Seata实现、下载启动Seata服务、搭建聚合父工程构建】(四)-全面详解(学习总结---从入门到深化)(下)
分布式事物【Seata实现、下载启动Seata服务、搭建聚合父工程构建】(四)-全面详解(学习总结---从入门到深化)
42 0
|
19天前
|
存储 Oracle 关系型数据库
分布式事物【Seata实现、下载启动Seata服务、搭建聚合父工程构建】(四)-全面详解(学习总结---从入门到深化)(上)
分布式事物【Seata实现、下载启动Seata服务、搭建聚合父工程构建】(四)-全面详解(学习总结---从入门到深化)
41 0
|
19天前
|
编译器 定位技术 开发工具
分布式版本控制系统Git的下载、安装与使用其复制GitHub项目代码的方法
分布式版本控制系统Git的下载、安装与使用其复制GitHub项目代码的方法
|
8月前
|
存储 索引
32分布式电商项目 - FastDFS文件上传与下载流程
32分布式电商项目 - FastDFS文件上传与下载流程
31 0
32分布式电商项目 - FastDFS文件上传与下载流程
|
存储 Shell 开发工具
Git 分布式版本控制工具01:Git介绍+下载+安装
远程备份:Git通过仓库管理文件,在Git中存在远程仓库,如果本地文件丢失还可以从远程仓库获取
73 0
|
存储 缓存 应用服务中间件
分布式文件系统FastDFS看这一篇就够了(文件上传下载、单机部署及集群部署)(二)
分布式文件系统FastDFS看这一篇就够了(文件上传下载、单机部署及集群部署)
462 0
分布式文件系统FastDFS看这一篇就够了(文件上传下载、单机部署及集群部署)(二)
|
存储 监控 Java
保姆级教程-分布式文件系统FastDFS(高效存储,有效解决大量资源上传下载)(三)
保姆级教程-分布式文件系统FastDFS(高效存储,有效解决大量资源上传下载)
160 0
保姆级教程-分布式文件系统FastDFS(高效存储,有效解决大量资源上传下载)(三)
|
存储 算法 安全
保姆级教程-分布式文件系统FastDFS(高效存储,有效解决大量资源上传下载)(二)
保姆级教程-分布式文件系统FastDFS(高效存储,有效解决大量资源上传下载)
98 0
保姆级教程-分布式文件系统FastDFS(高效存储,有效解决大量资源上传下载)(二)
|
存储 负载均衡 前端开发
保姆级教程-分布式文件系统FastDFS(高效存储,有效解决大量资源上传下载)(一)
保姆级教程-分布式文件系统FastDFS(高效存储,有效解决大量资源上传下载)
196 0
保姆级教程-分布式文件系统FastDFS(高效存储,有效解决大量资源上传下载)(一)