FastDFS
是一款高性能的分布式文件系统。主要功能包括:文件存储,文件同步,文件访问(上传下载)。它可以解决高容量和负载均衡的问题。FastDFS
适合用来做文件相关的网站,如图片分享、视频分享等。
一、FastDFS介绍
FastDFS
是一款开源的轻量级分布式文件系统C
实现,支持Linux
、FreeBSD
等UNIX
系统类google FS
,不是通用的文件系统,只能通过专有API
访问,目前提供了C
、Java
和PHP API
为互联网应用量身定做,解决大容量文件存储问题,追求高性能和高扩展性FastDFS
可以看做是基于文件的key value pair
存储系统,称作分布式文件存储服务更为合适。
二、FastDFS角色
FastDFS
服务端有三个角色:跟踪服务器(tracker server
)、存储服务器(storage server
)和客户端(client
)。
- tracker server
跟踪服务器,主要做调度工作,起负载均衡的作用。在内存中记录集群中所有存储组和存储服务器的状态信息,是客户端和数据服务器交互的枢纽。相比GFS中的master更为精简,不记录文件索引信息,占用的内存量很少。
- storage server
存储服务器(又称:存储节点或数据服务器),文件和文件属性(meta data
)都保存到存储服务器上。Storage server
直接利用OS
的文件系统调用管理文件。
- client
客户端,作为业务请求的发起方,通过专有接口,使用TCP/IP
协议与跟踪器服务器或存储节点进行数据交互。FastDFS
向使用者提供基本文件访问接口,比如upload
、download
、append
、delete
等,以客户端库的方式提供给用户使用。
三、文件上传的内部机制
首先客户端请求Tracker
服务获取到存储服务器的ip
地址和端口,然后客户端根据返回的IP
地址和端口号请求上传文件,存储服务器接收到请求后生产文件,并且将文件内容写入磁盘并返回给客户端file_id
、路径信息、文件名等信息,客户端保存相关信息上传完毕。
四、SpringBoot搭建FastDFS
- pom文件
<dependency>
<groupId>com.github.tobato</groupId>
<artifactId>fastdfs-client</artifactId>
<version>1.26.1-RELEASE</version>
</dependency>
- 配置类
@Component
public class FdfsConfig {
@Value("${fdfs.resHost}")
private String resHost;
@Value("${fdfs.storagePort}")
private String storagePort;
// 省略setget方法
}
- 上传方法
/**
* MultipartFile类型的文件上传ַ
* @param file
* @return
* @throws IOException
*/
public String uploadFile(MultipartFile file) throws IOException {
StorePath storePath = storageClient.uploadFile(file.getInputStream(), file.getSize(),
FilenameUtils.getExtension(file.getOriginalFilename()), null);
return getResAccessUrl(storePath);
}
- 删除文件方法
/**
* 删除文件
* @param fileUrl
*/
public void deleteFile(String fileUrl) {
if (StringUtils.isEmpty(fileUrl)) {
return;
}
try {
StorePath storePath = StorePath.praseFromUrl(fileUrl);
storageClient.deleteFile(storePath.getGroup(), storePath.getPath());
} catch (FdfsUnsupportStorePathException e) {
logger.warn(e.getMessage());
}
}
- FileController
@Controller
public class FileController {
@Autowired
private CommonFileUtil fileUtil;
@Autowired
private FdfsConfig fdfsConfig;
private final static Logger logger = LoggerFactory.getLogger(FileController.class);
// 跳转上传页面
@RequestMapping("/goIndex")
public String goIndex(){
logger.info("进入主页面");
return "/file";
}
// 使用fastdfs进行文件上传
@RequestMapping("/uploadFileToFast")
public String uoloadFileToFast(@RequestParam("fileName")MultipartFile file, RedirectAttributes attributes) throws IOException{
if(file.isEmpty()){
logger.info("文件不存在");
}
String path = fileUtil.uploadFile(file);
String url = fdfsConfig.getResHost()+path;
attributes.addAttribute("url", url);
return "redirect:/success";
}
// 跳转成功页面
@RequestMapping("/success")
public String success(HttpServletRequest request){
request.setAttribute("imgUrl", request.getParameter("url"));
logger.info(request.getParameter("url"));
logger.info("进入上传成功页面");
return "/success";
}
}
- 测试结果返回文件的路径,需要再加上url地址即可查看文件。
group1/M00/00/00/rBFikVzWXtOAZD4bAAA0EWRB2Io412.png
SpringBoot 集成FastDFS搭建完成。
源码在这里GitHub:
https://github.com/xiaonongOne/springboot-upload