Mongo 单个文档上限时16M,如果超过16M则需要采用GridFs方式将文件拆分

 

GridFS使用两个Collection存储文件:

  fs.file: 用于存储文件的元数据 (metadata)

       fs.chunk:存储文件内容的二进制数据(payload)

读文件时,先根据查询条件在file中找到对应文档,在根据_id映射到chunk collection中查询所有file_id=_id 的文档,最后根据n字段顺序读取chunk的data字段还原文件    

 

 

 code:

package com.example.mongo.binary.api.controller;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Date;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

import javax.sql.rowset.CachedRowSet;

import com.example.mongo.binary.api.config.MongoConfig;
import com.example.mongo.binary.api.entity.PayloadEntity;
import com.mongodb.MongoClient;
import org.apache.commons.io.FileUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.gridfs.GridFsOperations;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import com.mongodb.gridfs.GridFSDBFile;

/**
 * Realiza la interacción con la BD las dos colecciones de GridFs.
 * @author Ever
 */
@RestController
public class BinaryDataController {
    //Interfaz de operaciones para Grid provista por SpringBoot, inyección Dependencia.
    @Autowired
    private GridFsOperations gridFsOperations;

    @Autowired
    private MongoTemplate mongoTemplate;

    @Autowired
    private MongoConfig mongoConfig;
    
    /**
     * Guarda un pdf en GridFS.
     * @param , el nombre del archivo sin la extensión esa se agrega en el método
     * @return, mensaje con el fileId del archivo. 
     * @throws FileNotFoundException, puede que no encuentre el nombre del archivo en el directorio preestablecido.
     */
    @GetMapping("/savePdf")
    public String savePdf() throws FileNotFoundException {
        String file="C:\\testcase\\test\\22222222.txt";
        String extension=".pdf"; 
        
        //Define Metadata
        DBObject metadata=new BasicDBObject();
        
        metadata.put("type", "data");
        //Store  File        //el nombre es el tercer Parametro
        int fileId=gridFsOperations.store(new FileInputStream("C:\\testcase\\test\\22222222.txt"),
                       file,"type/txt",metadata).getMachineIdentifier();
        
        //System.out.println("El id de almacenado fué:  "+fileId);               
        return "File Stored Sucessfully: "+file+"with FileId : "+fileId;
    }

    @GetMapping("/savetxt/grid")
    public String savetxt() throws FileNotFoundException {
        String file="C:\\testcase\\test\\1111.txt";
        //Define Metadata
        DBObject metadata=new BasicDBObject();

        metadata.put("type", "data");
        //Store  File        //el nombre es el tercer Parametro
        int fileId=gridFsOperations.store(new FileInputStream(file),
                file,"type/txt",metadata).getMachineIdentifier();
        //System.out.println("El id de almacenado fué:  "+fileId);
        return "File Stored Sucessfully: "+file+"with FileId : "+fileId;
    }

    @GetMapping("/savetxt/mongotemplate")
    public void savetxtmongotemplate() throws IOException {
        String file="C:\\testcase\\test\\1111.txt";
        PayloadEntity payloadEntity=new PayloadEntity();
        payloadEntity.setPayload(Files.readAllBytes(Paths.get(file)));
        mongoTemplate.save(payloadEntity,mongoConfig.getCollectionName());
    }

 

posted on 2022-01-06 17:51  colorfulworld  阅读(124)  评论(0编辑  收藏  举报