设为首页 加入收藏

TOP

Springboot集成MongoDB存储文件、读取文件(三)
2023-07-25 21:31:44 】 浏览:70
Tags:Springboot 集成 MongoDB 储文件 文件
port
java.io.*; import java.util.List; /** * @author zaoyu * @description:使用GridFS存储文件并做读取。 */ @SpringBootTest public class MongoGridFS { @Autowired private MongoTemplate mongoTemplate; // GridFS下的bucket,自行指定要把文件存储到哪个bucket。 private String BUCKET_NAME = "images"; // 源文件,即要被存储的文件的绝对路径 private String FILE_PATH = "D:\\temp\\onepiece.jpg"; // 存储文件后自动生成的存储文件信息的collection,一般是xx.files。 private String COLLECTION_NAME = "images.files"; // 用于演示接收输出文件的路径 private String FILE_OUTPUT_PATH = "C:\\Users\\onepiece\\Desktop\\"; @Test public void testGridFSSaveFiles() { saveToGridFS(); System.out.println("------------"); readFromGridFS(); } /** * 传入bucketName得到指定bucket操作对象。 * * @param bucketName * @return */ public GridFSBucket createGridFSBucket(String bucketName) { MongoDatabase db = mongoTemplate.getDb(); return GridFSBuckets.create(db, bucketName); } /** * 储存文件到GridFS */ public void saveToGridFS() { // 先调用上面方法得到一个GridFSBucket的操作对象 GridFSBucket gridFSBucket = createGridFSBucket(BUCKET_NAME); File file = new File(FILE_PATH); FileInputStream inputStream = null; try { inputStream = new FileInputStream(file); } catch (FileNotFoundException e) { e.printStackTrace(); } // 设置GridFS存储配置,这里是设置了每个chunk(块)的大小为1024个字节,也可以设置大一点。 MetaData是对文件的说明,如果不需要可以不写。 也是以键值对存在,BSON格式。 GridFSUploadOptions options = new GridFSUploadOptions().chunkSizeBytes(1024).metadata(new Document("user", "onepiece")); // 调用GridFSBucket中的uploadFromStream方法,把对应的文件流传递进去,然后就会以binary(二进制格式)存储到GridFS中,并得到一个文件在xx.files中的主键ID,后面可以用这个ID来查找关联的二进制文件数据。 ObjectId objectId = gridFSBucket.uploadFromStream(file.getName(), inputStream, options); System.out.println(file.getName() + "已存入mongodb gridFS, 对应id是:" + objectId); } /** * 从GridFS中读取文件 */ public void readFromGridFS() { // 这里查找条件我先不写,默认查所有,取第一条做验证演示。 用Document类接收。 List<Document> files = mongoTemplate.find(new Query(), Document.class, COLLECTION_NAME); Document file = files.get(0); // 得到主键ID,作为等下要查询的文件ID值。 ObjectId fileId = file.getObjectId("_id"); String filename = file.getString("filename"); // 先调用上面方法得到一个GridFSBucket的操作对象 GridFSBucket gridFSBucket = createGridFSBucket(BUCKET_NAME); // 调用openDownloadStream方法得到文件IO流。 InputStream downloadStream = gridFSBucket.openDownloadStream(fileId); FileOutputStream fileOutputStream = null; try { fileOutputStream = new FileOutputStream(FILE_OUTPUT_PATH + filename); // 把IO流直接到指定路径的输出流对象实现输出。 FileCopyUtils.copy(downloadStream, fileOutputStream); } catch (IOException e) { e.printStackTrace(); } finally { try { fileOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } }

 2.3 落库效果

bucket:

 

 注意这里的ID,就是files中的主键ID。

files collection (image.files):

 

 chunks collection (image.chunks)

可以看到这里的files_id就是对应image.files中的主键ID。文件被拆成多个chunk块。

 

三、小结

对于小文件的,可以直接转二进制存储,对于大于等于16MB的,使用GridFS存储。 

 

希望这篇文章能帮到大家,有错漏之处,欢迎指正。

请多点赞、评论~ 

完。

 

首页 上一页 1 2 3 下一页 尾页 3/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Spring Boot 中使用 Redis 下一篇Java Stream常见用法汇总,开发效..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目