【java】文件系统grifds在springboot中的简单使用

grifds是非关系型数据库mongdb自带的一个文件系统,这个文件系统将接收到的文件分块后,数据存储在一个名为fs.chunks的集合中,文件信息则存在fs.files中;

这里记录一下springboot中对grifds的文件上传和下载的简单使用;

首先是依赖:

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

正常的springboot项目中插入上述mongodb的依赖;

yml配置文件:

server:
  port: 8080
spring:
  application:
    name: ly_file_test
  data:
    mongodb:
      uri: mongodb://root:123456@localhost:27017
      database: ly_file_test

spring.data.mogodb.uri是针对mongodb的链接url,在这里面指定了用户名和密码,‘root’是用户名,‘123456’是密码;spring.data.mongodb.database指定要链接的数据库;

上传文件测试:

@Autowired
    GridFsTemplate gridFsTemplate;
    @Test
    public void contextLoads() throws FileNotFoundException {
        // 主要测试一下mongdb的文件系统
        // 上传测试
        String path = "G:\\jarpro\\ly_xuedu_front\\xc-ui-pc-static-portal\\tem\\2.jpg";
        InputStream in = new FileInputStream(new File(path));
        ObjectId ob = gridFsTemplate.store(in, "测试图片","img");
        System.out.println(ob.toString());
        // 文件在上传后,大文件会被自动分块,存储在表:fs.chunks中;文件信息则存储在fs.files中,两个集合通过
        // fs.chunks的files_id相关联;
    }

使用了spring提供的模板:gridFsTemplate;上传成功后在数据库中fs.chunks集合如下图:

测试的图片很小,所以没有分块,默认情况下会按照256k的大小对文件进行分块,文件本身的数据在data这个域中存储;

文件的信息则存储在fs.files中:

  

下载测试:

@Autowired
    MongoClient mongoClient;
    @Test
    public void download() throws IOException {

        // 下载测试,下载需要一个对象GridfsBucket对象,一般通过配置类放在spring里保存,这里手动创建
        // 先根据id查询
        String id = "5d286d893be13c14503865b3";
        GridFSFile gridFSFile = gridFsTemplate.findOne(Query.query(Criteria.where("_id").is(id)));
        // 数据库的指定
        MongoDatabase test = mongoClient.getDatabase("ly_file_test");
        GridFSBucket gridFSBucket = GridFSBuckets.create(test);
        // 打开流下载对象,参数是文件id
        GridFSDownloadStream gridFSDownloadStream = gridFSBucket.openDownloadStream(gridFSFile.getId());
        // 获取流对象
        GridFsResource gridFsResource = new GridFsResource(gridFSFile, gridFSDownloadStream);
        InputStream inputStream = gridFsResource.getInputStream();

        // 将文件复制下来
        OutputStream out = new FileOutputStream(new File("G:\\jarpro\\ly_xuedu_front\\xc-ui-pc-static-portal\\tem\\2(1).jpg"));
        int copy = IOUtils.copy(inputStream, out);
        System.out.println(copy);
    }

下载的话需要创建一个GridFsBucket对象,这个对象一般要以bean的形式配置在spring容器中,这里直接在例子中进行了创建;

 

posted @ 2019-07-15 21:00  随风EK  阅读(629)  评论(0)    收藏  举报