Spring Boot整合MongoDB文件上传下载

MongoDB 内置GridFS的一种存储机制.用来存储大型二进制文件.最适合存储不常改变但是经常需要连续访问的大文件.

存储原理

将大文件分隔为多个255KB的块,将每个块作为独立的文档进行存储,再用一个文件将这些块组织在一起并存储文件的元信息,而且MongoDB支持原数据存储,可以将块存储的开销降到非常低.

在这里插入图片描述
fs.chunks用来存储文件分隔的块及其所对应的位置.
fs.file用来存储文件的元信息

MongoDB POM依赖


    org.springframework.boot
    spring-boot-starter-data-mongodb



        commons-io
        commons-io
    

配置类

import com.mongodb.MongoClient;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.gridfs.GridFSBucket;
import com.mongodb.client.gridfs.GridFSBuckets;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Description
 * @Author 
 * @Date 
 */
@Configuration
public class MongoConfig {
	//读取配置文件数据库名称
    @Value("${spring.data.mongodb.database}")
    private String datebase;
	
	//将GridFSBucket 注入IOC
    @Bean
    GridFSBucket createGridFSBucket(MongoClient mongoClient){

        MongoDatabase database = mongoClient.getDatabase(datebase);

        GridFSBucket gridFSBucket = GridFSBuckets.create(database);

        return gridFSBucket;
    }
}

文件上传代码

@Autowired
//注入SpringBoot提供的mongodb的GridFS对象
private GridFsTemplate gridFsTemplate;

@Autowired
private GridFSBucket gridFSBucket;

@Test
public void uploadMongoDB() throws FileNotFoundException {
	
    File file = new File("F:\\xucheng\\xcEduCodet\\test-freemarker\\src\\main\\resources\\templates\\index_banner.ftl");
	
    InputStream inputStream = new FileInputStream(file);
    //5dc510761a3c29be50f87ae2
    //通过gridFsTemplate获取添加成功的ObjectId 
    ObjectId objectId = gridFsTemplate.store(inputStream, "index_banner.ftl");

    System.out.println(objectId);
}

获取到objectId 就可以去数据库中查询你存储的文件/文件元数据

下载代码

@Test
public void downLoad() throws IOException {
    //通过gridFsTemplate模版获取gridFSFile对象 根据Id查询单个对象
    GridFSFile gridFSFile = gridFsTemplate.findOne(Query.query(Criteria.where("_id").is("5dc50f4b1a3c29995087e7d1")));

    //根据文件ObjectId查出文件对象
    GridFSDownloadStream gridFSDownloadStream = gridFSBucket.openDownloadStream(gridFSFile.getObjectId());
	//获取文件的下载流
    GridFsResource gridFsResource = new GridFsResource(gridFSFile,gridFSDownloadStream);
	//将下载流转为输入流
    InputStream inputStream = gridFsResource.getInputStream();
	//设置输出流存储到指定位置
    OutputStream outputStream = new FileOutputStream(new File("F:\\xucheng\\xcEduCode\\xc-service-manage-cms\\src\\main\\resources\\index_banner.ftl"));
	//通过IOUtils完成流copy
    IOUtils.copy(inputStream,outputStream);
	
    outputStream.close();

    inputStream.close();
}

你可能感兴趣的:(springboot,mongodb)