【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

 

时间: 2024-09-10 08:23:24

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

MongoDB的基本安装与管理命令脚本总结_MongoDB

安装1. Linux安装MongoDB 1.1 创建数据目录和日志文件: mkdir -p /data/node/ touch /data/mongodb.log 1.2 安装mongodb: tar zxf mongodb-linux-x86_64-2.4.9.tgz mv mongodb-linux-x86_64-2.4.9 /opt/mongodb echo "export PATH=$PATH:/opt/mongodb/bin" >>/etc/profile sou

linux redis安装之后,set 什么命令都不执行

问题描述 linux redis安装之后,set 什么命令都不执行 每次输入命令 回车后,都变成了换行,有大神知道怎么解决吗? 解决方案 http://redis.readthedocs.org/en/latest/string/set.html SET key "new-value" 解决方案二: 多谢回答,我的命令没问题啊,问题是命令回车 不执行

中标-代码执行sudo -S命令不成功的问题

问题描述 代码执行sudo -S命令不成功的问题 C++写的程序 想要使用sodu创建一个文件: system("echo 密码 | sudo -S touch /opt/testfile"); 这一句话在我的机器上运行是可以的(双击可执行程序),但拿到别的linux系统(中标麒麟)上,双击可执行程序就没有创建文件,用QProcess也不行, 把这句话写成脚本,在程序中把参数传给脚本运行也不行 但是在终端运行这个命令是可以的, 在终端运行这个可执行程序也可以. 就是图形界面下双击运行不

desktop entry-linux下的.desktop文件如何从命令行下执行?

问题描述 linux下的.desktop文件如何从命令行下执行? 这个文本用./abc.desktop来执行不好使: 命令行是把它当成脚本一句一句执行的,统统都是: not found 要怎样能执行它,就像在桌面点击的效果一样? 解决方案 desktop文件其实就是一个配置文件 比如: [Desktop Entry] Type=Application Terminal=true Name=unmount-mount Icon=/path/to/icon/icon.svg Exec=/path/t

Windows 10如何在命令行中执行Windows Defender

大家都知道 Windows Defender 是 Windows 10 中内置的反病毒.反恶意软件工具,通常情况下,它只在后台默默保护用户环境的安全.当然在用户需要的时候,也可通过其简洁明了的 GUI 图形界面进行更新定义和手动查杀等操作. 不过,你是否知道 Windows Defender 其实是支持在命令行下工作的呢?想必有人已经想到了,只要支持命令行,我们就可以利用其特性执行无限的自定义或计划任务了. MSASCui.exe MSASCui.exe 是 Windows Defender 带

windows-sql复制到window命令行中执行出错

问题描述 sql复制到window命令行中执行出错 在zend studio中写好sql,那些表之类的都加了单引号,复制到window命令行中执行就出错, 但是删除了所有的引号之后就好了,这是为什么,我又该怎么复制? 解决方案 引号需要转义,另外查询内部不能有作为引号的字符,检查下,还不行贴出你的sql和错误信息. 解决方案二: 谢谢你,我知道原因了O(∩_∩)O~

Android中执行java命令的方法及java代码执行并解析shell命令_Android

android中执行java命令的方法大家都晓得吗,下面一段内容给大家带来了具体解析. android的程序基于java开发,当我们接上调试器,执行adb shell,就可以执行linux命令,但是却并不能执行java命令. 那么在android的shell中是否就不能执行java程序了呢. 答案是否定的.我们可以通过app_process来执行java程序. 写一个hello world吧,就是刚开始学java的时候 写得那个hello world,这次要在android上运行. 用记事本新建

Android中执行java命令的方法及java代码执行并解析shell命令

android中执行java命令的方法大家都晓得吗,下面一段内容给大家带来了具体解析. android的程序基于java开发,当我们接上调试器,执行adb shell,就可以执行linux命令,但是却并不能执行java命令. 那么在android的shell中是否就不能执行java程序了呢. 答案是否定的.我们可以通过app_process来执行java程序. 写一个hello world吧,就是刚开始学java的时候 写得那个hello world,这次要在android上运行. 用记事本新建

看我如何黑掉PayPal:从任意文件上传到远程代码执行

本文讲的是看我如何黑掉PayPal:从任意文件上传到远程代码执行, 漏洞发现过程 在上一篇文章中,我描述了我是如何破解OSCP证书的,破解起来非常困难,大概花了我四个多月的时间,但是我如果我不去挖漏洞的话,意味着我就没有零用钱了. 正常人的周末充满了饮料,派对,乐趣等等.或者看权力的游戏 ? 像我这样的人,在周末的时候,会看一些博客或者YouTube视频.我打了Burp(关闭了拦截器)并访问了PayPal的漏洞奖励计划页面,于是我发现了如下图所示的内容: 上图显示的是我访问http://payp