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

参考: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目录下】

执行如下命令:

mongofiles.exe -d filesDB put ..\a.mp3

filesDB是数据库名字  ..\去上一层找   a.mp3是文件名字

 

然后我们在数据库中查询:

-->db.fs.chunks.find()

 

-->db.fs.files.find()

 

-->db.fs.chunks.find().count()

这个a.mp3文件工存储了9个集合

 

仅查询某个字段的 值

-->db.fs.chunks.find({"_id" : ObjectId("584f6a44150a0d241401b933")},{"data":1})

 

 

2.代码执行

上传文件到MongoDB

首先 获取连接

 1 package com.mongo.util;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 import com.mongodb.MongoClient;
 7 import com.mongodb.MongoCredential;
 8 import com.mongodb.ServerAddress;
 9 import com.mongodb.client.MongoDatabase;
10 
11 public class MongoConnection {
12      
13     /**
14      * 需要验证用户名  密码的 MongoDB的连接方式   com.mongodb.MongoClient.getDatabase("数据库名")
15      * @return
16      */
17     public MongoDatabase getConnection() {
18          try {  
19                 //连接到MongoDB服务 如果是远程连接可以替换“localhost”为服务器所在IP地址  
20                 //ServerAddress()两个参数分别为 服务器地址 和 端口  
21                 ServerAddress serverAddress = new ServerAddress("localhost",27017);  
22                 List<ServerAddress> addrs = new ArrayList<ServerAddress>();  
23                 addrs.add(serverAddress);  
24                   
25                 //MongoCredential.createScramSha1Credential()三个参数分别为 用户名 数据库名称 密码  
26                 MongoCredential credential = MongoCredential.createScramSha1Credential("username", "databaseName", "password".toCharArray());  
27                 List<MongoCredential> credentials = new ArrayList<MongoCredential>();  
28                 credentials.add(credential);  
29                   
30                 //通过连接认证获取MongoDB连接  
31                 MongoClient mongoClient = new MongoClient(addrs,credentials);  
32                   
33                 //连接到数据库  
34                 MongoDatabase mongoDatabase = mongoClient.getDatabase("databaseName");  
35                 System.out.println("连接成功");  
36                 return mongoDatabase;
37             } catch (Exception e) {  
38                 System.err.println( e.getClass().getName() + ": " + e.getMessage() );  
39             }  
40          return null;
41     }
42     
43     /**
44      * 不需要验证  用户名+密码  的获取连接的方式 com.mongodb.MongoClient.getDatabase("数据库名")
45      * @return
46      */
47     public MongoDatabase getConnectionBasis(){
48         try {
49             //连接到mongodb服务
50             MongoClient mongoClient = new MongoClient("localhost",27017);
51             MongoDatabase mongoDatabase = mongoClient.getDatabase("databaseName");
52             System.out.println("连接成功");
53             return mongoDatabase;
54         } catch (Exception e) {
55             System.out.println(e.getClass().getName()+":"+e.getMessage());
56         }
57         return null;
58     }
59     
60 }
View Code

接着 就可以创建 传输文件所用的通道了

注意 我将操作的文件放在这个位置

读取项目中某个文件夹下的文件要注意了

 1 package com.mongo.test;
 2 
 3 
 4 import java.io.File;
 5 import java.io.FileInputStream;
 6 import java.io.FileOutputStream;
 7 import java.io.IOException;
 8 
 9 import org.bson.types.ObjectId;
10 import org.junit.Test;
11 
12 import com.mongo.util.MongoConnection;
13 import com.mongodb.client.MongoDatabase;
14 import com.mongodb.client.gridfs.GridFSBucket;
15 import com.mongodb.client.gridfs.GridFSBuckets;
16 
17 /**
18  * MongoDB操作文件
19  * @author Administrator
20  *
21  */
22 public class MongoGridfs {
23     MongoConnection mongoConnection = new MongoConnection();
24     MongoDatabase database = mongoConnection.getConnectionBasis();
25     
26     @Test
27     public void gridf4File() throws IOException{
28         //创建 传输文件的通道
29         GridFSBucket buckets = GridFSBuckets.create(database);
30         //调用uploadFromStream上传
31         ObjectId objectId = buckets.uploadFromStream("test.mp3",new FileInputStream(new File(System.getProperty("user.dir")+"/file/test.mp3")));
32 
33         
34         FileOutputStream out = new FileOutputStream(new File("d:/aa.mp3"));
35         //调用downloadToStream下载
36         buckets.downloadToStream(objectId, out);
37         out.close();
38         
39     }
40     
41     
42 
43 }
View Code

这样就可以完成对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

 

posted @ 2016-12-13 11:42  Angel挤一挤  阅读(3369)  评论(0编辑  收藏