自定义mongo bucket

1.MongoConfig

@Configuration
public class MongoConfig {
    @Resource
    private MongoConverter converter;//接口类型,因为spring启动时候会加载所有bean,所以这里直接注入
    @Resource
    private MongoDatabaseFactory dbFactory;
    @Resource
    private MongoTemplate mongoTemplate;

    @Bean("gridFsBucketDoc")
    public GridFSBucket getGridFSBucketDoc() {
        MongoDatabase db = mongoTemplate.getDb();
        return GridFSBuckets.create(db, "doc_fs");
    }
    @Bean("gridFsBucketPic")
    public GridFSBucket getGridFSBucketPic() {
        MongoDatabase db = mongoTemplate.getDb();
        return GridFSBuckets.create(db, "pic_fs");
    }
    @Bean("gridFsTemplatePic")
    public GridFsTemplate getGridFsTemplatePic() {
        GridFsTemplate gridFsTemplate = new GridFsTemplate(dbFactory, converter, "pic_fs");
        return gridFsTemplate;
    }
    @Bean("gridFsTemplateDoc")
    public GridFsTemplate getGridFsTemplateDoc() {
        GridFsTemplate gridFsTemplate = new GridFsTemplate(dbFactory, converter, "doc_fs");
        return gridFsTemplate;
    }
}

2.application.yml

spring:
  servlet:
    multipart:
      max-file-size: 100MB  #单个文件上传大小
      max-request-size: 200MB  #连续上传文件大小

  #mongo配置-单机
  data:
    mongodb:
      host: 127.0.0.1
      port: 27017
      database: test
      username: root
      password: "123456"  #纯数字密码需要带双引号,否则报错
      authentication-database: admin
#      gridfs:
#        bucket: mms_fs   #配置该属性就会创建同名的gridfs bucket: mms_fs. 不配置创建默认的bucket: fs

3.GridFsService

@Service
public class GridFsService {
    private static final Logger log = LoggerFactory.getLogger(GridFsService.class);

    @Resource(name = "gridFsBucketDoc")
    private GridFSBucket gridFSBucket;
    @Resource(name = "gridFsTemplateDoc")
    private GridFsTemplate gridFsTemplate;

    @SneakyThrows
    public ObjectId uploadFile(MultipartFile file) {
        String contentType = file.getContentType();
        String filename = file.getOriginalFilename();
        InputStream inputStream = file.getInputStream();
        // 上传文件中我们也可以使用DBObject附加一些属性
        DBObject metadata = new BasicDBObject();
        metadata.put("name", "mms");
        return gridFsTemplate.store(inputStream, filename, contentType, metadata);
    }

    public GridFSFile getFileById(String fileId) {
        Query query = Query.query(Criteria.where("_id").is(fileId));
        GridFSFile gridFsFile = gridFsTemplate.findOne(query);
        String key = (String) gridFsFile.getMetadata().get("name");
        log.info("gridFsFile metadata key: {}", key);
        return gridFsFile;
    }

    public void deleteFileById(String fileId) {
        Query query = Query.query(Criteria.where("_id").is(fileId));
        GridFSFile file = gridFsTemplate.findOne(query);
        if (null == file) {
            log.info("文件删除失败,文件不存在");
            return;
        }
        gridFsTemplate.delete(query);
    }

    /**
     * 从mongo下载文件到浏览器保存
     */
    @SneakyThrows
    public byte[] downloadFileByIdToBrowser(String fileId, HttpServletResponse response) {
        Query query = Query.query(Criteria.where("_id").is(fileId));
        GridFSFile gridFsFile = gridFsTemplate.findOne(query);

        // 解决文件下载的时候,中文乱码的问题
        String name = new String(gridFsFile.getFilename().getBytes("GBK"), "ISO-8859-1");
        response.setHeader("Content-Disposition", "attachment;fileName=" + name);
        GridFSDownloadStream downloadStream = gridFSBucket.openDownloadStream(gridFsFile.getObjectId());

        //创建gridFsResource,用于获取流对象
        GridFsResource gridResource = new GridFsResource(gridFsFile, downloadStream);
        log.info(gridFsFile.getFilename() + ">>文件下载成功!!");
        return IoUtil.readBytes(gridResource.getInputStream());
    }

    /**
     * 从mongo中下载文件到指定目录
     */
    @SneakyThrows
    public void downloadFileByIdToDir(String fileId, String filePath) {
        Query query = Query.query(Criteria.where("_id").is(fileId));
        GridFSFile gridFsFile = gridFsTemplate.findOne(query);
        GridFsResource resource = gridFsTemplate.getResource(gridFsFile);

        File file = new File(filePath);
        FileOutputStream outputStream = new FileOutputStream(file);
        IoUtil.copy(resource.getInputStream(), outputStream);
        outputStream.close();
        log.info(gridFsFile.getFilename() + ">>文件下载成功!!");
    }
}

4.技术背景

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值