SpringBoot MongoDB GridFsTemplate实现文件管理

1. 添加maven

复制代码
       <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>

2. 配置文件GridFsTemplate实现临时文件和正式文件存储桶分离

复制代码
@Configuration
public class GridFsConfig {

    @Bean(name = "gridTempFsTemplate")
    public GridFsTemplate gridTempFsTemplate(MongoDatabaseFactory dbFactory, MongoConverter converter) {
        return new GridFsTemplate(dbFactory, converter, "tempFs");
    }

    @Bean(name = "gridFormalFsTemplate")
    public GridFsTemplate gridFormalFsTemplate(MongoDatabaseFactory dbFactory, MongoConverter converter) {
        return new GridFsTemplate(dbFactory, converter, "formalFs");
    }
}

3. 创建GridFsTemplateUtil工具类管理文件的上传、下载和删除

复制代码
@Slf4j
@Component
public class GridFsTemplateUtil {

    @Resource(name = "gridTempFsTemplate")
    private GridFsTemplate gridTempFsTemplate;

    @Resource(name = "gridFormalFsTemplate")
    private GridFsTemplate gridFormalFsTemplate;


    /**
     * 上传临时文件
     *
     * @param file 文件
     * @return {@link String}
     */
    public String saveTempFile(MultipartFile file, String fileName) {
        DBObject metaData = new BasicDBObject();
        metaData.put("createTime", new Date());
        metaData.put("createUser", SecurityContextUtils.getUserId());
        InputStream inputStream;
        try {
            inputStream = file.getInputStream();
            //文件流:inputStream
            //id:文件的唯一标识id
            //file.getContentType():内容类型
            //metaData:元数据
            return gridTempFsTemplate.store(inputStream, fileName, file.getContentType(), metaData).toString();
        } catch (IOException e) {
            log.error("上传失败", e);
            throw new MyException(ErrorCode.ERROR);
        }
    }

    /**
     * 上传临时文件
     *
     * @param file 文件
     * @return {@link String}
     */
    public String saveTempFile(MultipartFile file) {
        DBObject metaData = new BasicDBObject();
        metaData.put("createTime", new Date());
        metaData.put("createUser", SecurityContextUtils.getUserId());
        String fileName = file.getOriginalFilename();
        InputStream inputStream;
        try {
            inputStream = file.getInputStream();
            //文件流:inputStream
            //id:文件的唯一标识id
            //file.getContentType():内容类型
            //metaData:元数据
            return gridTempFsTemplate.store(inputStream, fileName, file.getContentType(), metaData).toString();
        } catch (IOException e) {
            log.error("上传失败", e);
            throw new MyException(ErrorCode.ERROR);
        }
    }

    /**
     * 上传正式文件
     *
     * @param file 文件
     * @return {@link String}
     */
    public String saveFormalFsFile(MultipartFile file) {
        DBObject metaData = new BasicDBObject();
        metaData.put("createTime", new Date());
        metaData.put("createUser", SecurityContextUtils.getUserId());
        String fileName = file.getOriginalFilename();
        InputStream inputStream;
        try {
            inputStream = file.getInputStream();
            //文件流:inputStream
            //id:文件的唯一标识id
            //file.getContentType():内容类型
            //metaData:元数据
            return gridFormalFsTemplate.store(inputStream, fileName, file.getContentType(), metaData).toString();
        } catch (IOException e) {
            log.error("上传失败", e);
            throw new MyException(ErrorCode.ERROR);
        }
    }

    /**
     * 上传正式文件
     *
     * @param file 文件
     * @return {@link String}
     */
    public String saveFormalFsFile(MultipartFile file, String fileName) {
        DBObject metaData = new BasicDBObject();
        InputStream inputStream;
        try {
            inputStream = file.getInputStream();
            //文件流:inputStream
            //id:文件的唯一标识id
            //file.getContentType():内容类型
            //metaData:元数据
            return gridFormalFsTemplate.store(inputStream, fileName, file.getContentType(), metaData).toString();
        } catch (IOException e) {
            log.error("上传失败", e);
            throw new MyException(ErrorCode.ERROR);
        }
        }

            /**
            * 获取临时文件
            *
            * @param id 文件id
            * @return {@link GridFsResource}
            */
            public GridFsResource getTempFile(String id) {
            log.info("Getting file.." + id);
            GridFSFile gridFsFile = gridTempFsTemplate
            .findOne(new Query(Criteria.where("_id").is(id)));
            if (gridFsFile != null) {
            return gridTempFsTemplate.getResource(gridFsFile);
        }
            throw new MyException(ErrorCode.ERROR);
        }

            /**
            * 获取正式文件
            *
            * @param id 文件id
            * @return {@link GridFsResource}
            */
            public GridFsResource getFormalFile(String id) {
            log.info("Getting file.." + id);
            GridFSFile gridFsFile = gridTempFsTemplate
            .findOne(new Query(Criteria.where("_id").is(id)));
            if (gridFsFile != null) {
            return gridFormalFsTemplate.getResource(gridFsFile);
        }
            throw new MyException(ErrorCode.ERROR);
        }

            /**
            * 删除临时文件
            *
            * @param id 文件id
            */
            public void deleteTempFile(String id) {
            gridTempFsTemplate.delete(new Query().addCriteria(Criteria.where("_id").is(id)));
        }

            /**
            * 删除正式文件
            *
            * @param id 文件id
            */
            public void deleteFormalFile(String id) {
            gridFormalFsTemplate.delete(new Query().addCriteria(Criteria.where("_id").is(id)));
        }
        }

4. 创建GridFsTemplateFileController控制器暴露上传、下载和删除接口

复制代码
@Slf4j
@RestController
@RequestMapping("/gridFsFile")
@Api(tags = "上传文件控制器")
public class GridFsTemplateFileController  {

    @Autowired
    private GridFsTemplateUtil gridFsTemplateUtil;

    /**
     * 上传临时文件
     *
     * @param file 文件
     * @return {@link RespJson}
     */
    @ApiOperation(value = "上传临时文件(mongodb)", notes = "上传临时文件(mongodb)")
    @PostMapping(value = "uploadTempFile", headers = "content-type=multipart/form-data")
    public RespJson<String> uploadTempFile(@RequestPart(value = "file") MultipartFile file) {
        return RespJson.success(gridFsTemplateUtil.saveTempFile(file));
    }

    /**
     * 上传正式文件
     *
     * @param file 文件
     * @return {@link RespJson}
     */
    @ApiOperation(value = "上传正式文件(mongodb)", notes = "上传正式文件(mongodb)")
    @PostMapping(value = "uploadFormalFile", headers = "content-type=multipart/form-data")
    public RespJson<String> uploadFormalFile(@RequestPart(value = "file") MultipartFile file) {
        return RespJson.success(gridFsTemplateUtil.saveFormalFsFile(file));
    }

    /**
     * 获取临时文件
     *
     * @param id 文件id
     * @return {@link RespJson}
     */
    @ApiOperation(value = "获取临时文件(mongodb)", notes = "获取临时文件(mongodb)")
    @GetMapping(value = "getTempFile")
    public ResponseEntity<InputStreamResource> getTempFile(HttpServletRequest request,
                                            HttpServletResponse response,
                                            @RequestParam String id) {
       try {
           GridFsResource tempFile = gridFsTemplateUtil.getTempFile(id);
           InputStream inputStream = tempFile.getInputStream();
           // 设置HTTP响应头
           HttpHeaders headers = new HttpHeaders();
           headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + tempFile.getFilename());
           headers.add(HttpHeaders.CONTENT_TYPE, tempFile.getContentType());
           headers.add(HttpHeaders.CONTENT_LENGTH, String.valueOf(Objects.requireNonNull(tempFile.getGridFSFile()).getLength()));
           // 返回文件流
           return ResponseEntity.ok()
                   .headers(headers)
                   .contentType(MediaType.parseMediaType(tempFile.getContentType()))
                   .body(new InputStreamResource(inputStream));
       }catch (Exception e){
           throw new MyException(ErrorCode.ERROR);
       }
    }

    /**
     * 获取正式文件
     *
     * @param id 文件id
     * @return {@link RespJson}
     */
    @ApiOperation(value = "获取正式文件(mongodb)", notes = "获取正式文件(mongodb)")
    @GetMapping(value = "getFormalFile")
    public ResponseEntity<InputStreamResource> getFormalFile(HttpServletRequest request,
                                                             HttpServletResponse response,
                                                             @RequestParam String id) {
        try {
            GridFsResource tempFile = gridFsTemplateUtil.getFormalFile(id);
            InputStream inputStream = tempFile.getInputStream();
            // 设置HTTP响应头
            HttpHeaders headers = new HttpHeaders();
            headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + tempFile.getFilename());
            headers.add(HttpHeaders.CONTENT_TYPE, tempFile.getContentType());
            headers.add(HttpHeaders.CONTENT_LENGTH, String.valueOf(Objects.requireNonNull(tempFile.getGridFSFile()).getLength()));
            // 返回文件流
            return ResponseEntity.ok()
                    .headers(headers)
                    .contentType(MediaType.parseMediaType(tempFile.getContentType()))
                    .body(new InputStreamResource(inputStream));
        }catch (Exception e){
            throw new MyException(ErrorCode.ERROR);
        }
    }

    /**
     * 删除临时文件
     *
     * @param id 文件id
     * @return {@link RespJson}
     */
    @ApiOperation(value = "删除临时文件(mongodb)", notes = "删除临时文件(mongodb)")
    @GetMapping(value = "deleteTempFile")
    public RespJson<Boolean> deleteTempFile(@RequestParam String id) {
        gridFsTemplateUtil.deleteTempFile(id);
        return RespJson.success();
    }

    /**
     * 获取正式文件
     *
     * @param id 文件id
     * @return {@link RespJson}
     */
    @ApiOperation(value = "获取正式文件(mongodb)", notes = "获取正式文件(mongodb)")
    @GetMapping(value = "deleteFormalFile")
    public RespJson<Boolean> deleteFormalFile(@RequestParam String id) {
        gridFsTemplateUtil.deleteFormalFile(id);
        return RespJson.success();
    }
}

5.总结

总体来说,GridFsTemplate提供了方便的API和高度可扩展的存储方案,使得在MongoDB中存储和检索大型文件变得更加容易和高效。

相关推荐
小咕聊编程1 小时前
【含文档+源码】基于SpringBoot的过滤协同算法之网上服装商城设计与实现
java·spring boot·后端
追逐时光者7 小时前
推荐 12 款开源美观、简单易用的 WPF UI 控件库,让 WPF 应用界面焕然一新!
后端·.net
Jagger_7 小时前
敏捷开发流程-精简版
前端·后端
苏打水com8 小时前
数据库进阶实战:从性能优化到分布式架构的核心突破
数据库·后端
西瓜er9 小时前
JAVA:Spring Boot 集成 FFmpeg 实现多媒体处理
java·spring boot·ffmpeg
间彧9 小时前
Spring Cloud Gateway与Kong或Nginx等API网关相比有哪些优劣势?
后端
间彧9 小时前
如何基于Spring Cloud Gateway实现灰度发布的具体配置示例?
后端
间彧9 小时前
在实际项目中如何设计一个高可用的Spring Cloud Gateway集群?
后端
间彧9 小时前
如何为Spring Cloud Gateway配置具体的负载均衡策略?
后端
间彧9 小时前
Spring Cloud Gateway详解与应用实战
后端