MongoDB GridFS 存储大文件

摘要:
我们经常遇到上传/下载文件等情况。有两种方法可以解决这个问题:将文件存储在服务器的文件系统中;将文件存储在数据库中。如果我们选择,我们可以使用MongoDB GridFS存储大于16MB的文件。

我们经常会遇到这样的场景:上传/下载文件。

有两种思路可以解决这个问题:

(1)将文件存储在服务器的文件系统中;

(2)将文件存储在数据库中。

如果我们选择(2),那么我们可以使用MongoDB GridFS 用于存储大小超过 16MB 的文件(文档,压缩文件,音视频,软件)。

一、MongoDB GridFS 介绍

MongoDB GridFS 是一个分布式文件系统,可用于存储/检索大小超过 16MB 的文件。

内部实现:将文件分割为一个个 chunk (默认大小为 255KB)进行存储。

两个优点:

(1)可以存储大文件(超过 16MB);

(2)可以从文件的中间位置访问文件。

二、代码示例

 1 public class FileService {
 2 
 3     // 返回DB
 4     private DB getDB() {
 5         // ...
 6     }
 7 
 8     /* 根据getDB()返回的DB新建一个GridFS实例并返回
 9      * 这个GridFS实例用于上传、下载、删除、查找文件。
10      */
11     private GridFS getGridFS() {
12         return new GridFS(getDB(), "自己定义的collection名");
13     }
14 
15     /**
16      * 保存类型为MultipartFile的文件
17      * 
18      * @param multipartFile
19      * @throws IOException
20      */
21     public void saveOne(final MultipartFile multipartFile) throws IOException {
22         saveOne(multipartFile.getInputStream(), multipartFile.getOriginalFilename());
23 
24     }
25 
26     /**
27      * 保存类型为java.io.File的文件
28      * 
29      * @param file
30      * @throws IOException
31      */
32     public void saveOne(final File file) throws IOException {
33         saveOne(new FileInputStream(file), file.getName());
34     }
35 
36     public void saveOne(final InputStream in, final String fileName) {
37         GridFSInputFile gridFSInputFile = getGridFS().createFile(in);
38         gridFSInputFile.setFilename(fileName);
39         gridFSInputFile.save();
40 
41     }
42 
43     /**
44      * 查询所有已上传的文件
45      * 
46      * @return
47      */
48     public Object queryAllFile() {
49         List<GridFSDBFile> result = getGridFS().find((DBObject) null);
50         List<Map<String, Object>> finalResult = new ArrayList<>();
51         Map<String, Object> map = null;
52         for (GridFSDBFile file : result) {
53             map = new HashMap<>();
54             map.put("id", ((ObjectId) file.getId()).toHexString());
55             map.put("fileName", file.getFilename());
56             map.put("length", file.getLength());
57             finalResult.add(map);
58 
59         }
60         return finalResult;
61     }
62 
63     /**
64      * 查询指定id的文件
65      * 
66      * @param hexStringId
67      *            十六进制的id
68      * @return
69      */
70     public GridFSDBFile queryOne(final String hexStringId) {
71         GridFSDBFile file = getGridFS().findOne(new ObjectId(hexStringId));
72         return file;
73 
74     }
75 
76     /**
77      * 删除给定id的文件
78      * 
79      * @param hexStringId
80      */
81     public void removeOne(final String hexStringId) {
82         getGridFS().remove(new ObjectId(hexStringId));
83     }
84 }

代码比较简单,就不做过多说明了。

免责声明:文章转载自《MongoDB GridFS 存储大文件》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇SQL SERVER事务处理Android图片处理下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Mongodb无法访问28107的问题

解压mongodb文件后,放到指定文件,最好别有空格、汉字之类的文件中 此时在mongodb文件夹下,建立一个 db 文件夹,此时执行启动命令,默认27017端口号可以打开,但是28017端口无法打开 解决方法: 先删除掉 mongod.lock 文件 该文件默认在你的db文件中 删除之后,在重启mongodb服务 启动的时候加上--rest,注意,是两...

下载特定区域内百度街景照片数据

下载特定区域内百度街景照片数据 本文是在康博的博文的基础上再整理的。 01 下载路网数据 基本上都是使用 Open Street Map (OSM) 的路网数据。下载 OSM 数据的方法有很多,这里就不再赘述。 我个人是使用 OpenStreetMap Data Extracts 下载了整个中国的数据,然后用研究区的边界数据进行了裁剪。具体是使用了 Arc...

地图距离排序一(mongodb篇)

首先我们准备数据集,创建一个 location 库,然后插入一些数据。如下: db.location.insert({"lng":经度,"lat":纬度,"loc":[lng,lat]}); db.location.insert({"lng":1,"lat":1,"loc":[1,1]}); db.location.insert({"lng":2,"lat...

SpringData MongoDB

一、使用步骤   1.1 导入pom依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</ar...

MySQL常见问题

1、mysql如何做分页 mysql数据库做分页用limit关键字,它后面跟两个参数startIndex和pageSize 2、mysql引擎有哪些,各自的特点是什么? innodb和myisam两个引擎,两者区别是innodb支持事物,myisam不支持innodb支持外键,myisam不支持innodb不支持全文索引,myisam支持全文索引innod...

MongoDB(6)- BSON 数据类型

BSON BSON是一种二进制序列化格式,用于在 MongoDB 中存储文档和进行远程过程调用 跟 JSON 的数据结构很像,但是支持更丰富的数据类型 数据类型 数据类型 序号 别名 备注 Double 1 double   String 2 string   Object 3 object   Array 4 array  ...