zoukankan      html  css  js  c++  java
  • 【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
  • 相关阅读:
    vue : 无法加载文件 C:Users1AppDataRoaming pmvue.ps1,因为在此系统上禁止运行脚本
    Flutter 常用的第三方库
    Dart 中的类
    Flutter 学习
    在 VSCode 中开发Flutter项目
    Flutter 环境配置的一些坑
    前端资源和优秀项目地址
    一小时学习JQuery材料
    基于RCT6的YX6100语音模块方案
    Java中反射和内省代码实例
  • 原文地址:https://www.cnblogs.com/sxdcgaq8080/p/6169243.html
Copyright © 2011-2022 走看看