博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【MongoDB】6.关于MongoDB存储文件的 命令执行+代码执行
阅读量:5837 次
发布时间:2019-06-18

本文共 8227 字,大约阅读时间需要 27 分钟。

参考: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      * @return16      */17     public MongoDatabase getConnection() {18          try {  19                 //连接到MongoDB服务 如果是远程连接可以替换“localhost”为服务器所在IP地址  20                 //ServerAddress()两个参数分别为 服务器地址 和 端口  21                 ServerAddress serverAddress = new ServerAddress("localhost",27017);  22                 List
addrs = new ArrayList
(); 23 addrs.add(serverAddress); 24 25 //MongoCredential.createScramSha1Credential()三个参数分别为 用户名 数据库名称 密码 26 MongoCredential credential = MongoCredential.createScramSha1Credential("username", "databaseName", "password".toCharArray()); 27 List
credentials = new ArrayList
(); 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 * @return46 */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 Administrator20  *21  */22 public class MongoGridfs {23     MongoConnection mongoConnection = new MongoConnection();24     MongoDatabase database = mongoConnection.getConnectionBasis();25     26     @Test27     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 AGEN23  *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
addrs = new ArrayList
(); 31 addrs.add(serverAddress); 32 //第一个参数report:用户名,第二个参数report:数据库名,第三个参数"sa".toCharArray():密码33 MongoCredential credential = MongoCredential.createScramSha1Credential("report", "report", "sa".toCharArray()); 34 List
credentials = new ArrayList
(); 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的id53 //如果不行,我就不知道了,你解决后跟我说一下,让我长长见识!thank you54 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 file65 // 1 = the first revision66 // 2 = the second revision67 // etc..68 // -2 = the second most recent revision69 // -1 = the most recent revision70 gsb.downloadToStreamByName(gfsf.getFilename(), fos, new GridFSDownloadByNameOptions());71 System.out.println(gfsf.getFilename() + "---" + gfsf.getObjectId() + "---" + gfsf.getId());72 } catch (Exception e) { //57178cd65eeb4f1f5c2cbaf273 System.err.println(e.getClass().getName() + ":" + e.getMessage()); 74 } 75 }76 }
View Code

 

转载地址:http://xpncx.baihongyu.com/

你可能感兴趣的文章
存储过程Oracle(一)
查看>>
log4j日志归档
查看>>
Java笔记01——IO流
查看>>
mysql遇见error,1049
查看>>
NYOJ311 完全背包
查看>>
codevs——2822 爱在心中
查看>>
Python基础班---第一部分(基础)---Python基础知识---认识Python
查看>>
JAVA MAC 配置
查看>>
1134 最长上升子序列 (序列型 DP)
查看>>
js冒泡排序
查看>>
第一次作业 4班卢炳武
查看>>
抽象类的调用
查看>>
使用硬盘,安装双系统,Win7+CentOS
查看>>
Javascript学习总结
查看>>
php 用正则替换中文字符一系列问题解决
查看>>
ActiveMQ应用笔记一:基本概念&安装
查看>>
大话数据结构之四(串)
查看>>
加热炉简是新来的整个系统的板
查看>>
Mockito使用注意事项
查看>>
[LeetCode] Palindrome Linked List 回文链表
查看>>