【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,并输入下面的代码:
>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
首先 获取连接
package com.mongo.util; import java.util.ArrayList;
import java.util.List; import com.mongodb.MongoClient;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import com.mongodb.client.MongoDatabase; public class MongoConnection { /**
* 需要验证用户名 密码的 MongoDB的连接方式 com.mongodb.MongoClient.getDatabase("数据库名")
* @return
*/
public MongoDatabase getConnection() {
try {
//连接到MongoDB服务 如果是远程连接可以替换“localhost”为服务器所在IP地址
//ServerAddress()两个参数分别为 服务器地址 和 端口
ServerAddress serverAddress = new ServerAddress("localhost",27017);
List<ServerAddress> addrs = new ArrayList<ServerAddress>();
addrs.add(serverAddress); //MongoCredential.createScramSha1Credential()三个参数分别为 用户名 数据库名称 密码
MongoCredential credential = MongoCredential.createScramSha1Credential("username", "databaseName", "password".toCharArray());
List<MongoCredential> credentials = new ArrayList<MongoCredential>();
credentials.add(credential); //通过连接认证获取MongoDB连接
MongoClient mongoClient = new MongoClient(addrs,credentials); //连接到数据库
MongoDatabase mongoDatabase = mongoClient.getDatabase("databaseName");
System.out.println("连接成功");
return mongoDatabase;
} catch (Exception e) {
System.err.println( e.getClass().getName() + ": " + e.getMessage() );
}
return null;
} /**
* 不需要验证 用户名+密码 的获取连接的方式 com.mongodb.MongoClient.getDatabase("数据库名")
* @return
*/
public MongoDatabase getConnectionBasis(){
try {
//连接到mongodb服务
MongoClient mongoClient = new MongoClient("localhost",27017);
MongoDatabase mongoDatabase = mongoClient.getDatabase("databaseName");
System.out.println("连接成功");
return mongoDatabase;
} catch (Exception e) {
System.out.println(e.getClass().getName()+":"+e.getMessage());
}
return null;
} }
接着 就可以创建 传输文件所用的通道了
注意 我将操作的文件放在这个位置
读取项目中某个文件夹下的文件要注意了
package com.mongo.test; import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException; import org.bson.types.ObjectId;
import org.junit.Test; import com.mongo.util.MongoConnection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.gridfs.GridFSBucket;
import com.mongodb.client.gridfs.GridFSBuckets; /**
* MongoDB操作文件
* @author Administrator
*
*/
public class MongoGridfs {
MongoConnection mongoConnection = new MongoConnection();
MongoDatabase database = mongoConnection.getConnectionBasis(); @Test
public void gridf4File() throws IOException{
//创建 传输文件的通道
GridFSBucket buckets = GridFSBuckets.create(database);
//调用uploadFromStream上传
ObjectId objectId = buckets.uploadFromStream("test.mp3",new FileInputStream(new File(System.getProperty("user.dir")+"/file/test.mp3"))); FileOutputStream out = new FileOutputStream(new File("d:/aa.mp3"));
//调用downloadToStream下载
buckets.downloadToStream(objectId, out);
out.close(); } }
这样就可以完成对MongoDB的文件传输了
还有一点补充的代码 是基友的代码作为参考 【很详细】:
package com.mongo.util; import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;
import org.bson.conversions.Bson;
import com.mongodb.BasicDBObject;
import com.mongodb.MongoClient;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.gridfs.GridFSBucket;
import com.mongodb.client.gridfs.GridFSBuckets;
import com.mongodb.client.gridfs.GridFSFindIterable;
import com.mongodb.client.gridfs.model.GridFSDownloadByNameOptions;
import com.mongodb.client.gridfs.model.GridFSFile; /**
*
* @author AGEN
*
*/
public class TestMondodb {
public static void main(String[] args) {
try {
//localhost:mongodb服务器的地址, 27017:mongodb服务器的端口
ServerAddress serverAddress = new ServerAddress("localhost", 27017);
List<ServerAddress> addrs = new ArrayList<ServerAddress>();
addrs.add(serverAddress);
//第一个参数report:用户名,第二个参数report:数据库名,第三个参数"sa".toCharArray():密码
MongoCredential credential = MongoCredential.createScramSha1Credential("report", "report", "sa".toCharArray());
List<MongoCredential> credentials = new ArrayList<MongoCredential>();
credentials.add(credential); //通过连接认证获取MongoDB连接
MongoClient mongoClient = new MongoClient(addrs, credentials); //连接到数据库
MongoDatabase mongoDatabase = mongoClient.getDatabase("report"); //创建文件存取通道
GridFSBucket gsb = GridFSBuckets.create(mongoDatabase); //向mongodb里面写入文件
// File file = new File("F:\\500226199001096256.jpg");
// FileInputStream fis = new FileInputStream(file);
// ObjectId id = gsb.uploadFromStream("字根.jpg", fis); //按Id查找文件,并保存到指定地方
//注意,下面ID为fs.files的id, 非fs.chunks的id
//如果不行,我就不知道了,你解决后跟我说一下,让我长长见识!thank you
FileOutputStream fos = new FileOutputStream(new File("D:\\aaaa.jpg"));
// gsb.downloadToStream(new ObjectId("57178cd65eeb4f1f5c2cbaf1"), fos); //对于你那个uuid是36位的,可以这样构建条件来查询将下列md5换成你的_id,对应的值换成像的36位uuid即可
Bson bson = new BasicDBObject("md5", "4d08209a90345ec9ebb0baf99dd218a1");
GridFSFindIterable gsfi = gsb.find(bson);
//因为你的_id是用uuid来表示的,是唯一的,所以应该可以也只能查出一条记录,在此就直接取第一条,否则应该再筛选
GridFSFile gfsf = gsfi.first();
//按文件名来取得此文件,第三个参数直接创建,表示取此文件的最新版本,如果需要取较旧的版本,则new GridFSDownloadByNameOptions().revision(0)
//其中0为版本号,表示如下
// 0 = the original stored file
// 1 = the first revision
// 2 = the second revision
// etc..
// -2 = the second most recent revision
// -1 = the most recent revision
gsb.downloadToStreamByName(gfsf.getFilename(), fos, new GridFSDownloadByNameOptions());
System.out.println(gfsf.getFilename() + "---" + gfsf.getObjectId() + "---" + gfsf.getId());
} catch (Exception e) { //57178cd65eeb4f1f5c2cbaf2
System.err.println(e.getClass().getName() + ":" + e.getMessage());
}
}
}
【MongoDB】6.关于MongoDB存储文件的 命令执行+代码执行的更多相关文章
- 风炫安全web安全学习第三十节课 命令执行&代码执行基础
风炫安全web安全学习第三十节课 命令执行&代码执行基础 代码执行&命令执行 RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统. 远程系统命令执行 ...
- mongodb突然出现不是内外部命令或可执行
可能因为晚上突然停电,电脑突然关机,给mongoDB造成影响,第二天出现了: 通过百度搜索与尝试:https://blog.csdn.net/hh12211221/article/details/78 ...
- 菜刀(代码执行)函数和命令执行函数详解及Getshell方法
i春秋作家:大家奥斯的哦 原文来自:https://bbs.ichunqiu.com/thread-41471-1-1.html 代码执行函数 VS 命令执行函数 一直想整理这两块的内容,但是一直没时 ...
- php中代码执行&&命令执行函数
转自i春秋 1.eval()函数 #传入的参数必须为PHP代码,既需要以分号结尾. #命令執行:cmd=system(whoami); #菜刀连接密码:cmd <?php @eval($_POS ...
- 【随笔】菜刀(代码执行)函数和命令执行函数详解及Getshell方法
代码执行函数 VS 命令执行函数 一直想整理这两块的内容,但是一直没时间弄,直到前两天碰上一个写入了菜刀马但是死活连不上菜刀的站,顿时不知道怎么继续了,所以就趁这个机会整理了一下代码执行函数怎么get ...
- 快速掌握mongoDB(一)——mongoDB安装部署和常用shell命令
1.mongoDB简介 mongoDB 是由C++语言编写的,是一种分布式的面向文档存储的开源nosql数据库.nosql是Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统 ...
- mongoDB(一)——mongoDB安装部署和常用shell命令
1.mongoDB简介 mongoDB 是由C++语言编写的,是一种分布式的面向文档存储的开源nosql数据库.nosql是Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统 ...
- MongoDB(4):多种方式关闭服务命令
http://blog.csdn.net/czw698/article/details/8791153 MongoDB 提供几种关闭服务的命令,具体为以下: 一 使用 Crtl+C 关闭 [mong ...
- MongoDB笔记(三)启动命令mongod的参数
上一节有关访问权限的笔记,是由启动命令mongod的参数auth引发的有关问题,这节就来看看mongod的其他参数 MongoDB启动命令mongod参数说明: 基本配置 --quiet # 安静输出 ...
随机推荐
- Java基础-一个java文件多个类的问题
一个.java文件当然可以包括多个类.但这些类有一个特殊的类与其它的不同,,这个类是带public 属性的类.一个.java类文件中仅有一个public属性的类.而且这个类与文件名相同.
- 如何修复Ubuntu 14.04 系统设置丢失的问题
其实遇到这个问题的一个最主要的原因是之前执行过卸载ibus输入法的操作,所以为了避免这个问题请不要卸载ibus输入法,大家依然可以安装fcitx输入法使用. 如果已经出现了这个问题,那该怎么解决呢?很 ...
- JS-面向对象
话说,再次看完这个实例后的我,开始怀疑面向对象和JSON的区别...并开始怀疑这是面向对象的真实性 <!DOCTYPE html> <html> <head> &l ...
- Linux快速体验
目录结构: /:根目录,根目录下一般只存放子目录,不存放文件./bin: 存放可执行的二进制文件,如常用的命令ls. tar.mv. cat等./boot: 存放linux系统启动时需要的一些文件./ ...
- Python之路【第十七篇】Django进阶篇
规范 确立规范的好处: 代码可读性高 方便代码的定位极其查找 为以后代码扩容带来便利 场景: 在多个APP的场景下,单个app的URL函数功能较多的时候,我们可以通过以下方法来解决. 把Views写成 ...
- SVN和Git下载地址
SVN: TortoiseSVN:https://tortoisesvn.net/downloads.html (安装包和语言) Git: Git for Windows:https://git-fo ...
- pyquery的问题
在使用pyquery时发现一些问题, 1.爬取的html中如果有较多的错误时,不能很好的补全. 2.如果要获取某个class中的内容时,如果内容太多不能取完整!只能取一部分. 这个在现在的最新版本中还 ...
- vijos1404 遭遇战
描述 今天,他们在打一张叫DUSTII的地图,万恶的恐怖分子要炸掉藏在A区的SQC论坛服务器!我们SQC的人誓死不屈,即将于恐怖分子展开激战,准备让一个人守着A区,这样恐怖分子就不能炸掉服务器了.(一 ...
- R语言爬虫初尝试-基于RVEST包学习
注意:这文章是2月份写的,拉勾网早改版了,代码已经失效了,大家意思意思就好,主要看代码的使用方法吧.. 最近一直在用且有维护的另一个爬虫是KINDLE 特价书爬虫,blog地址见此: http://w ...
- LwIP移植和使用
LwIP移植和使用 本手册基于lwip-1.4.x编写,本人没有移植过1.4.0之前的版本,更早的版本或许有差别.如果看官发现问题欢迎联系<QQ: 937431539 email: 93743 ...