SpringBoot集成FastDFS

FastDFS是一款高性能的分布式文件系统。主要功能包括:文件存储,文件同步,文件访问(上传下载)。它可以解决高容量和负载均衡的问题。FastDFS适合用来做文件相关的网站,如图片分享、视频分享等。

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_第1张图片

SpringBoot搭建FastDFS

pom文件

    
        com.github.tobato
        fastdfs-client
        1.26.1-RELEASE
    

配置类

@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

 1 @Controller
 2public class FileController {
 3@Autowired
 4private CommonFileUtil fileUtil;
 5
 6@Autowired
 7private FdfsConfig fdfsConfig;
 8
 9private final static Logger logger = LoggerFactory.getLogger(FileController.class);
10
11// 跳转上传页面
12@RequestMapping("/goIndex")
13public String goIndex(){
14    logger.info("进入主页面");
15    return "/file";
16}
17
18// 使用fastdfs进行文件上传
19@RequestMapping("/uploadFileToFast")
20public String uoloadFileToFast(@RequestParam("fileName")MultipartFile file, RedirectAttributes attributes) throws IOException{
21
22    if(file.isEmpty()){
23        logger.info("文件不存在");
24    }
25    String path = fileUtil.uploadFile(file);
26    String url = fdfsConfig.getResHost()+path;
27    attributes.addAttribute("url", url);
28    return "redirect:/success";
29}
30
31// 跳转成功页面
32@RequestMapping("/success")
33public String success(HttpServletRequest request){
34    request.setAttribute("imgUrl", request.getParameter("url"));
35    logger.info(request.getParameter("url"));
36    logger.info("进入上传成功页面");
37    return "/success";
38}
39
40}

测试结果返回文件的路径,需要再加上url地址即可查看文件。

group1/M00/00/00/rBFikVzWXtOAZD4bAAA0EWRB2Io412.png

 

SpringBoot 集成FastDFS搭建完成。

源码在这里GitHub:github源码

 

你可能感兴趣的:(SpringBoot)