SpringBoot 操作 MongoDB GridFS

  • 日常
  • 2020-01-09 00:34:09
  • 浏览 449
简介文件系统到了后期会变的很难管理,同时不利于扩展,此外想做分布式文件系统也显得不那么容易。而GridFS却正好相反,它基于MongoDB的文件系统,便于管理和扩展。

警告:以下操作均不适合在生产环境使用。
建议:生产环境请使用成熟 OSS 方案。

准备工作

要操作 MongoDB,首先得有,安装参考 MongoDB 官方网站,选择自己对应的操作系统进行安装,MongoDB官方网站。修改 MongoDB 配置,配置文件的路径是 /etc/mongod.conf,修改配置的bindIp选项,修改为 0.0.0.0,使得任何设备都可以连接。

# network interfaces
net:
  port: 27017
  bindIp: 0.0.0.0

为什么先改bindIp,这样可以用客户端工具连接,执行添加用户和设置密码的命令,也可以使用命令mongo进入 MongoDB shell 设置,效果一样。依次执行如下代码。

// 使用admin数据库
use admin
// 创建root用户
db.createUser({user: 'root', pwd: '********', roles: ['root']})
// 查看用户是否设置成功
db.system.users.find()

这里需要注意,密码设置要复杂一些,不推荐国际密码这种东西。再次编辑配置文件/etc/mongod.conf,开启安全认证。

security:
  authorization: enabled

SpringBoot 加入 MongoDB 依赖

编辑工程 pom.xml 文件,加入依赖。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

配置 MongoDB 数据库链接。

spring:
  data:
    mongodb:
      host: 10.249.1.140
      database: static
      authentication-database: admin
      username: root
      password: !国际密码

编写一个提供GridFS的service。

public interface GridfsService {

    String upload(MultipartFile file);

    GridResource resource(String id);

}

编写一个接口的实现类。

@Service
public class GridsServiceImpl implements GridfsService {

    @Autowired
    private GridFsTemplate gridFsTemplate;

    @Autowired
    private MongoDbFactory mongoDbFactory;

    @Override
    public String upload(MultipartFile file) {
        try {
            ObjectId objectId = gridFsTemplate.store(file.getInputStream(), file.getOriginalFilename(), file.getContentType());
            return objectId.toString();
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

    @Override
    public GridResource resource(String id) {
        GridFSFile gridFSFile = gridFsTemplate.findOne(Query.query(Criteria.where("_id").is(id)));
        String contentType = gridFSFile.getMetadata().getString("_contentType");
        GridFSBucket bucket = GridFSBuckets.create(mongoDbFactory.getDb());
        GridFSDownloadStream stream = bucket.openDownloadStream(gridFSFile.getObjectId());
        GridFsResource resource = new GridFsResource(gridFSFile, stream);
        return new GridResource().setMediaType(contentType).setResource(resource);
    }

}

编写控制器,用于测试。

@Api(tags = "静态资源")
@RestController(value = "publishStaticController")
@RequestMapping(value = "static")
public class StaticController extends PublishController {

    @Autowired
    private GridfsService gridfsService;

    @RequestMapping(value = "resource", method = RequestMethod.GET)
    public ResponseEntity<?> resource(
            @RequestParam(value = "id") String id
    ) {
        GridResource resource = gridfsService.resource(id);
        return ResponseEntity.ok().contentType(MediaType.parseMediaType(resource.getMediaType())).body(resource.getResource());
    }

    @ApiOperation(value = "上传文件")
    @RequestMapping(value = "upload", method = RequestMethod.POST)
    public Object upload(@RequestParam(value = "file") MultipartFile file) {
        String objectId = gridfsService.upload(file);
        if (!ObjectUtils.isEmpty(objectId)) {
            return ResultFormat.success("上传成功", objectId);
        }
        return ResultFormat.error("上传失败");
    }

}

测试

打开swagger接口文档,已经看到刚才编写的控制器了。

上传一个文件测试一下。

上传成功了,并返回了ObjectID,使用这个ID去调用查询接口,测试是否可以查询到文件。

成功获取到刚才上传的文件了。查看数据库中,也相应的存储了上传的文件了。

文章评论