springboot整合mongoDB实现文件上传、下载、删除、通过元数据查找、通过id查找

控制器

package com.gen.server.module.model.controller;

import com.gen.server.module.model.base.MongodbServer;
import com.gen.server.module.model.entity.IconDes;
import com.mongodb.client.gridfs.GridFSFindIterable;
import com.mongodb.client.gridfs.model.GridFSFile;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.bson.Document;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;

/**
 * @author fxr
 * @date 2022/4/7
 */
@RestController
@RequestMapping("/mongo/operation")
@Api(tags = "Mongo上传下载")
public class MongoController {
    @Autowired
    private MongodbServer mongodbServer;

    @PostMapping("/upload")
    @ApiOperation(value = "上传文件", notes = "/upload")
    public String upload(MultipartFile multipartFile,
                         IconDes iconDes)  {
        String objectId = null;
        try {
           objectId = mongodbServer.uploadMongoDB(multipartFile.getInputStream(),
                    multipartFile.getOriginalFilename(),
                    iconDes);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return objectId;
    }

    @PostMapping("/download")
    @ApiOperation(value = "下载文件", notes = "/download")
    public void download(String objectId,
                         String desAdress)  {
        try {
            mongodbServer.downLoadMongoDB(objectId, desAdress);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    @GetMapping("/findOne/{objectId}")
    @ApiOperation(value = "查找一个", notes = "/findOne/{objectId}")
    public GridFSFile findOne(@PathVariable("objectId") String objectId)  {
        return mongodbServer.findOne(objectId);
    }

    @DeleteMapping("/deleteOne/{objectId}")
    @ApiOperation(value = "删除一个", notes = "/deleteOne/{objectId}")
    public void deleteOne(@PathVariable("objectId") String objectId)  {
        mongodbServer.deleteOne(objectId);
    }

    @GetMapping("/findByMeteData")
    @ApiOperation(value = "通过元数据查找", notes = "/findByMeteData")
    public GridFSFindIterable findByType()  {
        return mongodbServer.findByMeteData();
    }

}

服务代码

package com.gen.server.module.model.base;

import com.gen.server.module.model.entity.IconDes;
import com.mongodb.BasicDBObject;
import com.mongodb.client.gridfs.GridFSBucket;
import com.mongodb.client.gridfs.GridFSDownloadStream;
import com.mongodb.client.gridfs.GridFSFindIterable;
import com.mongodb.client.gridfs.model.GridFSFile;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.bson.BsonValue;
import org.bson.Document;
import org.bson.types.ObjectId;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.gridfs.GridFsResource;
import org.springframework.data.mongodb.gridfs.GridFsTemplate;
import org.springframework.stereotype.Component;

import java.io.*;
import java.util.Date;
import java.util.List;

/**
 * @author fxr
 * @date 2022/4/7
 */
@Component
public class MongodbServer {
    //注入SpringBoot提供的mongodb的GridFS对象
    @Autowired
    private GridFsTemplate gridFsTemplate;

    @Autowired
    private GridFSBucket gridFSBucket;

    public String uploadMongoDB(InputStream inputStream, String fileName, IconDes iconDes) 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, fileName, iconDes);

//        System.out.println(objectId);

        return objectId.toString();
    }

    public void downLoadMongoDB(String objectId,String desAdress) throws IOException {
        //通过gridFsTemplate模版获取gridFSFile对象 根据Id查询单个对象
        GridFSFile gridFSFile = gridFsTemplate.findOne(Query.query(Criteria.where("_id").is(objectId)));
        //根据文件ObjectId查出文件对象
        GridFSDownloadStream gridFSDownloadStream = gridFSBucket.openDownloadStream(gridFSFile.getObjectId());
        //获取文件的下载流
        GridFsResource gridFsResource = new GridFsResource(gridFSFile,gridFSDownloadStream);
        //将下载流转为输入流
        InputStream inputStream = gridFsResource.getInputStream();
        //设置输出流存储到指定位置
        OutputStream outputStream = null;
        if (desAdress.endsWith("\\")){
             outputStream = new FileOutputStream(new File(desAdress+gridFSFile.getFilename()));
        }else {
            outputStream = new FileOutputStream(new File(desAdress+"\\"+gridFSFile.getFilename()));
        }
        //通过IOUtils完成流copy
        IOUtils.copy(inputStream,outputStream);

        outputStream.close();

        inputStream.close();
    }

    public GridFSFile findOne(String objectId){
        GridFSFile gridFSFile = gridFsTemplate.findOne(Query.query(Criteria.where("_id").is(objectId)));
        String fileName = gridFSFile.getFilename();
        ObjectId objectId1 = gridFSFile.getObjectId();
        int size = gridFSFile.getChunkSize();
        BsonValue bsonValue = gridFSFile.getId();
        long length = gridFSFile.getLength();
        Document document = gridFSFile.getMetadata();
        Date uploadDate = gridFSFile.getUploadDate();
//        System.out.println(document);
        return gridFSFile;
    }

    public void deleteOne(String objectId){
        gridFsTemplate.delete(Query.query(Criteria.where("_id").is(objectId)));
    }

    public GridFSFindIterable findByMeteData(){
        GridFSFindIterable gridFSFile = gridFsTemplate.find(Query.query(Criteria.where("metadata.type").is("展示")));
        return gridFSFile;
    }


}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值