【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容器中,这里直接在例子中进行了创建;
学习java的新手,尝试将学到的内容总结为博客,内容如有错误,欢迎指正,感激不尽。