您的位置:首页 > 数据库 > Mongodb

【MongoDB】6.关于MongoDB存储文件的 命令执行+代码执行

2016-12-13 11:42 645 查看
参考:http://www.runoob.com/mongodb/mongodb-gridfs.html 

 1.命令执行

MongoDB GridFS

GridFS 用于存储和恢复那些超过16M(BSON文件限制)的文件(如:图片、音频、视频等)。

GridFS 也是文件存储的一种方式,但是它是存储在MonoDB的集合中。

GridFS 可以更好的存储大于16M的文件。

GridFS 会将大文件对象分割成多个小的chunk(文件片段),一般为256k/个,每个chunk将作为MongoDB的一个文档(document)被存储在chunks集合中。

GridFS 用两个集合来存储一个文件:fs.files与fs.chunks。

每个文件的实际内容被存在chunks(二进制数据)中,和文件有关的meta数据(filename,content_type,还有用户自定义的属性)将会被存在files集合中。

GridFS 添加文件

现在我们使用 GridFS 的 put 命令来存储 mp3 文件。 调用 MongoDB 安装目录下bin的 mongofiles.exe工具。

打开命令提示符,进入到MongoDB的安装目录的bin目录中,找到mongofiles.exe,并输入下面的代码:

1 >mongofiles.exe -d gridfs put song.mp3


gridfs是存储文件的数据名称。如果不存在该数据库,MongoDB会自动创建。Song.mp3 是音频文件名。

例如:【将a.mp3文件放在MongoDB目录下】

1 package com.mongo.util;
2
3
4 import java.io.File;
5 import java.io.FileOutputStream;
6 import java.util.ArrayList;
7 import java.util.List;
8 import org.bson.conversions.Bson;
9 import com.mongodb.BasicDBObject;
10 import com.mongodb.MongoClient;
11 import com.mongodb.MongoCredential;
12 import com.mongodb.ServerAddress;
13 import com.mongodb.client.MongoDatabase;
14 import com.mongodb.client.gridfs.GridFSBucket;
15 import com.mongodb.client.gridfs.GridFSBuckets;
16 import com.mongodb.client.gridfs.GridFSFindIterable;
17 import com.mongodb.client.gridfs.model.GridFSDownloadByNameOptions;
18 import com.mongodb.client.gridfs.model.GridFSFile;
19
20 /**
21  *
22  * @author AGEN
23  *
24  */
25 public class TestMondodb {
26      public static void main(String[] args) {
27          try {
28              //localhost:mongodb服务器的地址, 27017:mongodb服务器的端口
29              ServerAddress serverAddress = new ServerAddress("localhost", 27017);
30              List<ServerAddress> addrs = new ArrayList<ServerAddress>();
31              addrs.add(serverAddress);
32              //第一个参数report:用户名,第二个参数report:数据库名,第三个参数"sa".toCharArray():密码
33              MongoCredential credential = MongoCredential.createScramSha1Credential("report", "report", "sa".toCharArray());
34              List<MongoCredential> credentials = new ArrayList<MongoCredential>();
35              credentials.add(credential);
36
37              //通过连接认证获取MongoDB连接
38              MongoClient mongoClient = new MongoClient(addrs, credentials);
39
40              //连接到数据库
41              MongoDatabase mongoDatabase = mongoClient.getDatabase("report");
42
43              //创建文件存取通道
44              GridFSBucket gsb = GridFSBuckets.create(mongoDatabase);
45
46              //向mongodb里面写入文件
47 //             File file = new File("F:\\500226199001096256.jpg");
48 //             FileInputStream fis = new FileInputStream(file);
49 //             ObjectId id = gsb.uploadFromStream("字根.jpg", fis);
50
51              //按Id查找文件,并保存到指定地方
52              //注意,下面ID为fs.files的id, 非fs.chunks的id
53              //如果不行,我就不知道了,你解决后跟我说一下,让我长长见识!thank you
54              FileOutputStream fos = new FileOutputStream(new File("D:\\aaaa.jpg"));
55 //             gsb.downloadToStream(new ObjectId("57178cd65eeb4f1f5c2cbaf1"), fos);
56
57              //对于你那个uuid是36位的,可以这样构建条件来查询将下列md5换成你的_id,对应的值换成像的36位uuid即可
58              Bson bson = new BasicDBObject("md5", "4d08209a90345ec9ebb0baf99dd218a1");
59              GridFSFindIterable gsfi = gsb.find(bson);
60              //因为你的_id是用uuid来表示的,是唯一的,所以应该可以也只能查出一条记录,在此就直接取第一条,否则应该再筛选
61              GridFSFile gfsf = gsfi.first();
62              //按文件名来取得此文件,第三个参数直接创建,表示取此文件的最新版本,如果需要取较旧的版本,则new GridFSDownloadByNameOptions().revision(0)
63              //其中0为版本号,表示如下
64 //            0 = the original stored file
65 //            1 = the first revision
66 //            2 = the second revision
67 //            etc..
68 //            -2 = the second most recent revision
69 //            -1 = the most recent revision
70              gsb.downloadToStreamByName(gfsf.getFilename(), fos, new GridFSDownloadByNameOptions());
71              System.out.println(gfsf.getFilename() + "---" + gfsf.getObjectId() + "---" + gfsf.getId());
72          } catch (Exception e) {  //57178cd65eeb4f1f5c2cbaf2
73              System.err.println(e.getClass().getName() + ":" + e.getMessage());
74          }
75     }
76 }


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐