参考: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
  1. gridfs是存储文件的数据名称。如果不存在该数据库,MongoDB会自动创建。Song.mp3 是音频文件名。

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

执行如下命令:

  1. 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. }

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

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

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

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

这样就可以完成对MongoDB的文件传输了

还有一点补充的代码 是基友的代码作为参考  【很详细】:

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

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

  1. 风炫安全web安全学习第三十节课 命令执行&代码执行基础

    风炫安全web安全学习第三十节课 命令执行&代码执行基础 代码执行&命令执行 RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统. 远程系统命令执行 ...

  2. mongodb突然出现不是内外部命令或可执行

    可能因为晚上突然停电,电脑突然关机,给mongoDB造成影响,第二天出现了: 通过百度搜索与尝试:https://blog.csdn.net/hh12211221/article/details/78 ...

  3. 菜刀(代码执行)函数和命令执行函数详解及Getshell方法

    i春秋作家:大家奥斯的哦 原文来自:https://bbs.ichunqiu.com/thread-41471-1-1.html 代码执行函数 VS 命令执行函数 一直想整理这两块的内容,但是一直没时 ...

  4. php中代码执行&&命令执行函数

    转自i春秋 1.eval()函数 #传入的参数必须为PHP代码,既需要以分号结尾. #命令執行:cmd=system(whoami); #菜刀连接密码:cmd <?php @eval($_POS ...

  5. 【随笔】菜刀(代码执行)函数和命令执行函数详解及Getshell方法

    代码执行函数 VS 命令执行函数 一直想整理这两块的内容,但是一直没时间弄,直到前两天碰上一个写入了菜刀马但是死活连不上菜刀的站,顿时不知道怎么继续了,所以就趁这个机会整理了一下代码执行函数怎么get ...

  6. 快速掌握mongoDB(一)——mongoDB安装部署和常用shell命令

    1.mongoDB简介 mongoDB 是由C++语言编写的,是一种分布式的面向文档存储的开源nosql数据库.nosql是Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统 ...

  7. mongoDB(一)——mongoDB安装部署和常用shell命令

    1.mongoDB简介 mongoDB 是由C++语言编写的,是一种分布式的面向文档存储的开源nosql数据库.nosql是Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统 ...

  8. MongoDB(4):多种方式关闭服务命令

    http://blog.csdn.net/czw698/article/details/8791153 MongoDB 提供几种关闭服务的命令,具体为以下: 一 使用 Crtl+C 关闭  [mong ...

  9. MongoDB笔记(三)启动命令mongod的参数

    上一节有关访问权限的笔记,是由启动命令mongod的参数auth引发的有关问题,这节就来看看mongod的其他参数 MongoDB启动命令mongod参数说明: 基本配置 --quiet # 安静输出 ...

随机推荐

  1. 在WildFly中运行多个standalone模式的实例

      WildFly作为一款优秀的EJB容器,其前身为JBoss AS.JBoss作为一款开源的应用服务器,被广泛的应用在各种项目当中.假设我们现在有这样一个项目,他是以standalone的模式运行在 ...

  2. C++变参数模板和...操作符

    https://en.wikipedia.org/wiki/Variadic_template https://msdn.microsoft.com/en-us/library/dn439779.as ...

  3. Oracle 图形化以及命令行安装

    @(Oracle)[Install] Oracle 安装 相关版本说明 不同版本的Oracle需要安装在特定的系统版本之上. 如Oracle 11gR2的11.2.0.1.0需要安装在CentOS 5 ...

  4. 将C#文档注释生成.chm帮助文档

    由于最近需要把以前的一个项目写一个文档,但一时又不知道写成怎样的,又恰好发现了可以生成chm的工具,于是乎我就研究了下,感觉还不错,所以也给大家分享下.好了,不多废话,下面就来实现一下吧. 生成前的准 ...

  5. MYSQL提权方法

    cve-2016-6662 MYSQL提权分析 MySQL <= 5.7.15 远程代码执行/ 提权 (0day) 5.6.33 5.5.52 Mysql分支的版本也受影响,包括: MariaD ...

  6. Digital calculation

    No1=1 No2=2 1. let result=No1+No2   let No1++    let No1+=3 2. result=$[No1+No2] 3. result=$((No1+No ...

  7. 用C语言,如何判断主机是 大端还是小端(字节序)

    所谓大端就是指高位值在内存中放低位地址,所谓小端是指低位值在内存中放低位地址.比如 0x12345678 在大端机上是 12345678,在小端机上是 78564312,而一个主机是大端还是小端要看C ...

  8. sqlplus连接oracle失败分析和解决

    背景: 多台Linux服务器需要安装Oracle客户端,实现和Oracle数据库连接做业务处理. 安装完第一台后,直接将安装的目录压缩并复制到其他几台机器上,启动sqlplus连接数据库时,一直提示输 ...

  9. Python正则表达式详解

    我用双手成就你的梦想 python正则表达式 ^ 匹配开始 $ 匹配行尾 . 匹配出换行符以外的任何单个字符,使用-m选项允许其匹配换行符也是如此 [...] 匹配括号内任何当个字符(也有或的意思) ...

  10. JDBC连接数据库演示案例

    import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sq ...