您的位置:

FastDFS SpringBoot整合使用指南

FastDFS是一个开源的高性能分布式文件系统,主要解决了海量媒体文件存储及访问问题,它采用了一种特殊的两层目录结构,第一层目录为组名(group),第二层目录由用户自行指定(如M00、M01等),文件名则随意指定。SpringBoot是一个快速开发的Java EE微服务框架,它提供了丰富的插件机制,开发者只需要配置简单的参数,就可以便捷地与各种中间件快速集成,进而实现更高效的开发与部署。本文主要介绍如何使用FastDFS SpringBoot Starter将FastDFS文件系统集成到SpringBoot应用中,实现文件上传、下载、删除等操作。

一、快速集成

1、 在SpringBoot项目中加入fastdfs-spring-boot-starter依赖,Maven如下:

<dependency>
     <groupId>com.github.tobato</groupId>
     <artifactId>fastdfs-client-java-spring-boot-starter</artifactId>
     <version>2.0.2</version>
</dependency>

2、 配置application.yml文件,增加FastDFS相关配置参数,如下所示:

spring:
  proiles: dev
# FastDFS相关参数配置
fdfs:
# FastDFS服务器地址
  tracker-list: 192.168.0.109:22122
  connect-timeout: 5000
  network-timeout: 30000
  charset: UTF-8
  http:
    anti-steal-token: false
    secret-key:
  pool:
    max-total: 1000
    max-idle: 100
    min-idle: 10
    max-wait-millis: 5000

以上配置分别指定了FastDFS服务器地址、连接超时、网络超时、字符集、HTTP相关参数和连接池相关参数等。

二、文件上传

1、 在Controller层中注入FastFileStorageClient接口;

@RestController
@RequestMapping("/file")
public class FileUploadController {

    @Autowired
    private FastFileStorageClient storageClient;

    @PostMapping(value = "/upload")
    public String uploadFile(@RequestParam("file") MultipartFile file) throws IOException {
        StorePath storePath = storageClient.uploadFile(file.getInputStream(), file.getSize(), FilenameUtils.getExtension(file.getOriginalFilename()), null);
        return storePath.getFullPath();
    }
}

2、 上述代码中,MultipartFile为Spring MVC框架中的文件上传对象,通过构造InputStream、文件大小和文件后缀名等参数,调用FastFileStorageClient的uploadFile方法即可将文件上传到指定的FastDFS服务器上,方法返回值StorePath即为上传后的文件路径及文件名等信息,其中,getFullPath方法返回完整的文件路径信息。

三、文件下载

1、 在Controller层中注入DownloadByteArray接口;

@RestController
@RequestMapping("/file")
public class FileDownloadController {

    @Autowired
    private DownloadByteArray downloadService;

    @GetMapping(value = "/download/{path}")
    public ResponseEntity&lt;byte[]&gt; downloadFile(@PathVariable("path") String path) throws IOException {
        byte[] content = downloadService.download(path);
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        headers.setContentDisposition(ContentDisposition.builder("attachment").filename(FilenameUtils.getName(path)).build());
        return new ResponseEntity&lt;&gt;(content, headers, HttpStatus.OK);
    }
}

2、 上述代码中,DownloadByteArray为FastDFS提供的下载文件服务接口,调用download方法即可获取相应的文件内容;headers.setContentType指定内容类型为二进制流,headers.setContentDisposition指定输出文件名及下载方式为附件形式,最终使用ResponseEntity将文件内容、header参数和状态信息进行包装后返回。

四、文件删除

1、 在Controller层中注入FastFileStorageClient接口;

@RestController
@RequestMapping("/file")
public class FileDeleteController {

    @Autowired
    private FastFileStorageClient storageClient;

    @DeleteMapping(value = "/delete/{path}")
    public String deleteFile(@PathVariable("path") String path) {
        storageClient.deleteFile(path);
        return "success";
    }
}

2、 上述代码中,FastFileStorageClient提供的deleteFile方法可以实现快速删除指定的FastDFS文件,删除成功后返回success表示删除成功。

五、注意事项

1、 关于存储路径

StorePath storePath = storageClient.uploadFile(file.getInputStream(), file.getSize(), FilenameUtils.getExtension(file.getOriginalFilename()), null);

以上代码会返回一个StorePath对象,其中getStorePath()和getFullPath()是不同的。getStorePath()方法只返回后缀,而getFullPath()方法会返回完整的相对路径+文件名,如:group1/M00/00/00/wKgA71iLY1SAXMdhAAKq-VYtE_8629.jpg

2、FastDFS文件名大小限制

FastDFS文件名大小限制为128个字节,在调用上传服务时,应该确保文件名不超过该长度,可以通过FilenameUtils.getName(path)方法从文件完整路径中提取文件名,然后使用substring()等方法截取小于128个字节的子串,作为文件名。

3、fastdfs-spring-boot-starter的版本与升级

fastdfs-spring-boot-starter的版本与fastdfs-client-java的版本是有依赖关系的,一般需保证二者版本相同。

六、总结

FastDFS SpringBoot Starter提供了一种快速集成FastDFS分布式文件系统的方式,方便开发者能够便捷地使用FastDFS提供的丰富特性。本文介绍了如何使用FastDFS SpringBoot Starter实现SpringBoot文件的上传、下载和删除等操作,并对存储路径、FastDFS文件名大小限制和fastdfs-spring-boot-starter版本升级等注意事项进行了详细介绍。