MongoDB GridFS 存储文件

MongoDB GridFS 存储文件

一、介绍
1、GridFS是MongoDB的一种存储机制,用来存储大型二进制文件。
最适合于不常改变但是经常需要连续访问的大文件。

2、存储原理:将大文件分割为多个比较大的块,将每个块作为独立的文档进行存储,
再用一个文件用于将这些块组织在一起并存储文件的元信息。
同时MongoDB支持二进制存储,所以可以将块存储的开销降到非常低。

3、GridFS中:
块会被存储到专用的集合中,默认使用集合为fs.chunks,其中包含的键有:

  • _id 主键
  • files_id 块所属文件的元信息
  • n 块所在文件中的对应位置
  • data 块所包含的二进制数据

每个文件的元信息被保存在一个单独的集合中,默认使用集合为fs.files,除自定义键外,还需包含:

  • _id 主键
  • length 文件所包含的字节数
  • chunkSize 组成文件的每个块的大小,单位为字节,默认值为256KB,可调整
  • uploadDate 文件被上传到GridFS的日期
  • md5 文件内容的MD5校验值,该值由服务器端测试得到

二、代码(以存储图片为例)
1、连接数据库
(一)数据库没有用户名和密码

    public static DB getDB(String url_port, String database, String username, String password){
        List<ServerAddress> serverAddList = new ArrayList<>();
        ServerAddress serverAddress = new ServerAddress(url_port);
        serverAddList.add(serverAddress);
        List<MongoCredential> credentialList = new ArrayList<>();
        MongoCredential credential = MongoCredential.createCredential(username, database, password.toCharArray());
        credentialList.add(credential);
        MongoClient mongoClient = new MongoClient(serverAddList,credentialList);
        return mongoClient.getDB(database);
    }

(二)数据库有用户名和密码

    public static DB getDB(String host, int port, String database){
        MongoClient mongoClient = new MongoClient(host,port);
        DB db = mongoClient.getDB(database);
        return db;
    }

2、获取GridFS

    public static GridFS getGridFS(DB db){
        GridFS gridFS = new GridFS(db, "fs");
        return gridFS;
    }

3、插入图片
插入图片的时候会自动以创建GridFS时指定的名称创建两张表,分别是XX.chunks,XX.files

    public static void insertFile(GridFS gridFS){
        try{
            File file = new File("图片路径");
            GridFSInputFile gridFSFile = gridFS.createFile(file);
            gridFSFile.save();
            System.out.println("插入图片成功");
        }catch (Exception e){
            e.printStackTrace();
        }
    }

4、删除图片

   public static void deleteFile(GridFS gridFS){
        BasicDBObject query = new BasicDBObject();
        query.put("filename","b1ff438fc1576b6ff7a20e61f4301e68.jpg");
        gridFS.remove(query);
        System.out.println("删除成功");
    }

5、查找图片

    public static void findFile(GridFS gridFS){
        try {
            String fileName = "b1ff438fc1576b6ff7a20e61f4301e68.jpg";
            String path = "C:\\Users\\Desktop\\pitcture\\"+fileName;
            BasicDBObject query = new BasicDBObject();
            query.put("filename",fileName);
            GridFSDBFile gridFSOne = gridFS.findOne(query);
            //path必须指定到文件,否则会报错java.io.FileNotFoundException: C:\... (拒绝访问。)
            gridFSOne.writeTo(new FileOutputStream(path));
            System.out.println("获取图片成功");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

文件元信息
这里写图片描述
该文件被分成多个小块然后存储在.chunks表中
这里写图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值