SpringBoot2 综合案例(10):整合 FastDFS 中间件,实现文件管理

Spring Boot 2 基础案例篇

包含:入门、日志管理、定时器、事务、AOP、数据库、缓存、NoSQL、监控、打包。

Spring Boot 2 高级案例篇

包含:整合常用中间件:分库分表、权限管理、Redis 集群、Dubbo、消息队列、定时器、搜索引擎、文件管理、邮件等

文件上传

文件上传是项目开发中一个很常用的功能,常见的如头像上传,各类文档数据上传等。SpringBoot 使用 MultiPartFile 接收来自表单的 file 文件,然后执行上传文件。该案例基于 SpringBoot2.0 中 yml 配置,管理文件上传的常见属性。该案例演示单文件上传和多文件上传。

搭建文件上传界面

引入页面模板 Jar 包

    org.springframework.boot    spring-boot-starter-thymeleaf

编写简单的上传页面


1、单文件上传

上传人:
文件一:

2、多文件上传

上传人:
文件一:
文件二:


配置页面入口

import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.GetMapping;@Controllerpublic class PageController {    /**     * 上传页面     */    @GetMapping("/uploadPage")    public String uploadPage (){        return "upload" ;    }}

与 SpringBoot2.0 整合

核心配置文件

  • 上传文件单个限制
  • max-file-size: 5MB
  • 上传文件总大小限制
  • max-request-size: 6MB
spring:  application:    # 应用名称    name: node14-boot-file  servlet:    multipart:      # 启用      enabled: true      # 上传文件单个限制      max-file-size: 5MB      # 总限制      max-request-size: 6MB

文件上传核心代码

  • 如果单个文件大小超出 1MB,抛出异常
  • FileSizeLimitExceededException:
  • 如果上传文件总大小超过 6MB,抛出异常
  • SizeLimitExceededException:
  • 这样就完全验证了 YML 文件中的配置,有效且正确。
import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletRequest;import java.io.File;import java.util.Map;@RestControllerpublic class FileController {    private static final Logger LOGGER = LoggerFactory.getLogger(FileController.class) ;    /**     * 测试单个文件上传     */    @RequestMapping("/upload1")    public String upload1 (HttpServletRequest request, @RequestParam("file") MultipartFile file){        Map paramMap = request.getParameterMap() ;        if (!paramMap.isEmpty()){            LOGGER.info("paramMap == >>{}",paramMap);        }        try{            if (!file.isEmpty()){                // 打印文件基础信息                LOGGER.info("Name == >>{}",file.getName());                LOGGER.info("OriginalFilename == >>{}",file.getOriginalFilename());                LOGGER.info("ContentType == >>{}",file.getContentType());                LOGGER.info("Size == >>{}",file.getSize());                // 文件输出地址                String filePath = "F:/boot-file/" ;                new File(filePath).mkdirs();                File writeFile = new File(filePath, file.getOriginalFilename());                file.transferTo(writeFile);            }            return "success" ;        } catch (Exception e){            e.printStackTrace();            return "系统异常" ;        }    }    /**     * 测试多文件上传     */    @RequestMapping("/upload2")    public String upload2 (HttpServletRequest request, @RequestParam("file") MultipartFile[] fileList){        Map paramMap = request.getParameterMap() ;        if (!paramMap.isEmpty()){            LOGGER.info("paramMap == >>{}",paramMap);        }        try{            if (fileList.length > 0){                for (MultipartFile file:fileList){                    // 打印文件基础信息                    LOGGER.info("Name == >>{}",file.getName());                    LOGGER.info("OriginalFilename == >>{}",file.getOriginalFilename());                    LOGGER.info("ContentType == >>{}",file.getContentType());                    LOGGER.info("Size == >>{}",file.getSize());                    // 文件输出地址                    String filePath = "F:/boot-file/" ;                    new File(filePath).mkdirs();                    File writeFile = new File(filePath, file.getOriginalFilename());                    file.transferTo(writeFile);                }            }            return "success" ;        } catch (Exception e){            return "fail" ;        }    }}

FastDFS 简介

FastDFS 作用

FastDFS 是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件上传、文件下载等,解决了大容量存储和负载均衡的问题。

核心角色

FastDFS 是由跟踪服务器(trackerserver)、存储服务器(storageserver)和客户端(client)三个部分组成。

1)跟踪服务器

FastDFS 的协调者,负责管理所有的 storage server 和 group,每个 storage 在启动后会连接 Tracker,告知自己所属的 group 等信息,并保持周期性的心跳,tracker 根据 storage 的心跳信息,建立 group 到[storage server list]的映射表。

2)存储服务器

以组(group)为单位,一个 group 内包含多台 storage 机器,数据互为备份,存储空间以 group 内容量最小的 storage 为准,所以建议 group 内的多个 storage 尽量配置相同,以免造成存储空间的浪费。

3)客户端

业务请求的发起方,通过专有接口,使用 TCP/IP 协议与跟踪器服务器或存储节点进行数据交互。

运转流程

1、存储服务定时向跟踪服务上传状态信息;2、客户端发起请求;3、跟踪器同步存储器状态,返回存储服务端口和 IP;4、客户端执行文件操作(上传,下载)等。

与 SpringBoot2 整合

核心步骤

1)、配置 FastDFS 执行环境2)、文件上传配置3)、整合 Swagger2 测试接口

核心依赖

    com.github.tobato    fastdfs-client    1.26.5    io.springfox    springfox-swagger2    2.6.1    io.springfox    springfox-swagger-ui    2.6.1

配置 FastDFS

0)核心配置文件

fdfs:  # 链接超时  connect-timeout: 60  # 读取时间  so-timeout: 60  # 生成缩略图参数  thumb-image:    width: 150    height: 150  tracker-list: 192.168.72.130:22122

1) 核心配置类

@Configuration@Import(FdfsClientConfig.class)// Jmx 重复注册 bean 的问题@EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING)public class DfsConfig {}

2)文件工具类

@Componentpublic class FileDfsUtil {    private static final Logger LOGGER = LoggerFactory.getLogger(FileDfsUtil.class);    @Resource    private FastFileStorageClient storageClient ;    /**     * 上传文件     */    public String upload(MultipartFile multipartFile) throws Exception{        String originalFilename = multipartFile.getOriginalFilename().                                  substring(multipartFile.getOriginalFilename().                                  lastIndexOf(".") + 1);        StorePath storePath = this.storageClient.uploadImageAndCrtThumbImage(                              multipartFile.getInputStream(),                              multipartFile.getSize(),originalFilename , null);        return storePath.getFullPath() ;    }    /**     * 删除文件     */    public void deleteFile(String fileUrl) {        if (StringUtils.isEmpty(fileUrl)) {            LOGGER.info("fileUrl == >>文件路径为空...");            return;        }        try {            StorePath storePath = StorePath.parseFromUrl(fileUrl);            storageClient.deleteFile(storePath.getGroup(), storePath.getPath());        } catch (Exception e) {            LOGGER.info(e.getMessage());        }    }}

文件上传配置

spring:  application:    name: ware-fast-dfs  servlet:    multipart:      enabled: true      max-file-size: 10MB      max-request-size: 20MB

配置 Swagger2

主要用来生成文件上传的测试界面。

1)配置代码类

@Configurationpublic class SwaggerConfig {    @Bean    public Docket createRestApi() {        return new Docket(DocumentationType.SWAGGER_2)                .apiInfo(apiInfo())                .select()                .apis(RequestHandlerSelectors.basePackage("com.fast.dfs"))                .paths(PathSelectors.any())                .build();    }    private ApiInfo apiInfo() {        return new ApiInfoBuilder()                .title("SpringBoot 利用 Swagger 构建 API 文档")                .description("使用 RestFul 风格, 创建人:知了一笑")                .termsOfServiceUrl("https://github.com/cicadasmile")                .version("version 1.0")                .build();    }}

2)启动类注解

@EnableSwagger2

演示案例

接口代码

@RestControllerpublic class FileController {    @Resource    private FileDfsUtil fileDfsUtil ;    /**     * 文件上传     */    @ApiOperation(value="上传文件", notes="测试 FastDFS 文件上传")    @RequestMapping(value = "/uploadFile",headers="content-type=multipart/form-data", method = RequestMethod.POST)    public ResponseEntity uploadFile (@RequestParam("file") MultipartFile file){        String result ;        try{            String path = fileDfsUtil.upload(file) ;            if (!StringUtils.isEmpty(path)){                result = path ;            } else {                result = "上传失败" ;            }        } catch (Exception e){            e.printStackTrace() ;            result = "服务异常" ;        }        return ResponseEntity.ok(result);    }    /**     * 文件删除     */    @RequestMapping(value = "/deleteByPath", method = RequestMethod.GET)    public ResponseEntity deleteByPath (){        String filePathName = "group1/M00/00/00/wKhIgl0n4AKABxQEABhlMYw_3Lo825.png" ;        fileDfsUtil.deleteFile(filePathName);        return ResponseEntity.ok("SUCCESS") ;    }}

执行流程

1、访问 http://localhost:7010/swagger-ui.html 测试界面2、调用文件上传接口,拿到文件在 FastDFS 服务的路径3、浏览器访问:http://192.168.72.130/group1/M00/00/00/wKhIgl0n4AKABxQEABhlMYw_3Lo825.png4、调用删除接口,删除服务器上图片5、清空浏览器缓存,再次访问图片 Url,回返回 404

源代码地址

GitHub 地址:知了一笑https://github.com/cicadasmile/spring-boot-basehttps://github.com/cicadasmile/middle-ware-parent码云地址:知了一笑https://gitee.com/cicadasmile/spring-boot-basehttps://gitee.com/cicadasmile/middle-ware-parent

本文首发于 GitChat,未经授权不得转载,转载需与 GitChat 联系。

阅读全文: http://gitbook.cn/gitchat/activity/5d77b36ecfe8912accfb8f38

您还可以下载 CSDN 旗下精品原创内容社区 GitChat App ,阅读更多 GitChat 专享技术内容哦。

FtooAtPSkEJwnW-9xkCLqSTRpBKX

你可能感兴趣的:(SpringBoot2 综合案例(10):整合 FastDFS 中间件,实现文件管理)