欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SpringBoot整合MongoDB实现文件上传下载删除

程序员文章站 2022-04-11 12:13:29
本文主要内容 mongodb基础操作命令示例练习 mongodb居于gridfstemplate的文件上传、下载、删除等操作(工作重点使用) 1. 基础命令创建的数据库名称:hors...

本文主要内容

  • mongodb基础操作命令示例练习
  • mongodb居于gridfstemplate的文件上传、下载、删除等操作(工作重点使用)

1. 基础命令

创建的数据库名称:horse,创建的集合名称:blog

# 创建数据库
use horse
# 删除当前数据库[horse]
db.dropdatebase()
# 查看所有数据库
show dbs

 # 设置用户的角色和权限
db.createuser({user:"horse",pwd:"mongo123",roles:[{role:"readwrite",db:"horse"}]})

# 创建指定名称的集合
db.createcollection("blog")
# 删除指定名称集合
db.blog.drop()
# 查看当前数据库[horse]中所有集合
show collections


# 插入文档
db.blog.insert({"name":"tom","age":23,"sex":true})
db.blog.insertone({"name":"top","age":20,"sex":true})
db.blog.insertmany([{"name":"jerry","age":22,"sex":false},{"name":"free","age":21,"sex":true}])


# 更新文档
db.blog.update({"name":"top"},{$set:{"name":"topsun"}},{multi:true})


# 删除文档
db.blog.remove({"sex":false}, true)
db.blog.deletemany({"age":23})
db.blog.deleteone({"age":22})
# 删除集合所有数据
db.blog.deleteman({})


# 查询文档
db.blog.find().pretty()   # 通过查询方式(没有条件,查询所有)
db.blog.findone({"name":"tom"})   # 查询一个
db.blog.find({"age":{$lt: 23},"name":"free"}).pretty()   # 默认and连接查询
db.blog.find({$or:[{"age":{$lt:23}},{"name":"free"}]}).pretty()   # or连接查询
db.blog.find({"age":{$lt:23},$or:[{"name":"free"},{"sex":"false"}]}).pretty() # and和or联合使用查询
db.blog.find().limit(2).skip(1).sort({"age":1}).pretty()   # limit、skip、sort联合使用(执行顺序:sort-> skip ->limit)

# 聚合查询(参考文档)
db.blog.aggregate([{$group:{_id:"$age",count:{$sum:1}}}])

2. gridfstemplate使用

2.1引入pom依赖

        <dependency>
            <groupid>org.springframework.boot</groupid>
            <artifactid>spring-boot-starter-data-mongodb</artifactid>
        </dependency>

2.2 配置yml

spring:
  data:
    mongodb:
      host: *.*.*.*
      username: ***
      password: ***
      database: ***
      port: 27017
 # 设置文件上传的大小限制
  servlet:
    multipart:
      max-file-size: 10mb
      max-request-size: 50mb

2.3 上传下载删除

面对疾风吧:接合hutool工具包食用更佳!!!

/**
 * @author mr.horse
 * @version 1.0
 * @description: mongodb的文件上传、下载、删除等基本操作(集合hutool工具库)
 * @date 2021/4/29 9:53
 */
@validated
@controller
@requestmapping("/mongo")
public class mongouploadcontroller {

    private static logger logger = loggerfactory.getlogger(mongouploadcontroller.class);

    @autowired
    private gridfstemplate gridfstemplate;

    @autowired
    private mongotemplate mongotemplate;

    private static final list<string> content_types = arrays.aslist("image/gif", "image/jpeg", "image/jpg", "image/png");

    /**
     * mongodb文件上传(图片上传)
     *
     * @param file
     * @return
     */
    @postmapping("/upload")
    public responseentity<string> fileupload(@requestparam("file") multipartfile file) {
        try {
            // 校验文件信息(文件类型,文件内容)
            string originalfilename = file.getoriginalfilename();
            if (strutil.isblank(originalfilename)) {
                return responseentity.badrequest().body("参数错误");
            }
            string contenttype = file.getcontenttype();
            if (!content_types.contains(contenttype)) {
                return responseentity.badrequest().body("文件类型错误");
            }
            inputstream inputstream = file.getinputstream();
            bufferedimage bufferedimage = imageio.read(inputstream);
            if (objectutil.isempty(bufferedimage)) {
                return responseentity.badrequest().body("文件内容错误");
            }

            // 文件重命名
            string suffix = filenameutil.getsuffix(originalfilename);
            string filename = idutil.simpleuuid().concat(".").concat(suffix);

            // 文件上传,返回objectid
            objectid objectid = gridfstemplate.store(inputstream, filename, contenttype);
            return strutil.isblank(string.valueof(objectid)) ? responseentity.status(httpstatus.internal_server_error).body("文件上传失败") : responseentity.ok(string.valueof(objectid));
        } catch (ioexception e) {
            return responseentity.badrequest().body("文件上传异常");
        }
    }


    /**
     * 根据objectid读取文件并写入响应流,页面进行进行相关操作,可以进行文件的下载和展示
     *
     * @param objectid
     */
    @getmapping("/read")
    public void queryfilebyobjectid(@requestparam("objectid") @notblank(message = "objectid不能为空") string objectid, httpservletresponse response) {
        // 根据objectid查询文件
        gridfsfile file = gridfstemplate.findone(new query(criteria.where("_id").is(objectid)));
        // 创建一个文件桶
        gridfsbucket gridfsbucket = gridfsbuckets.create(mongotemplate.getdb());
        inputstream inputstream = null;
        outputstream outputstream = null;
        try {
            if (objectutil.isnotnull(file)) {
                // 打开下载流对象
                gridfsdownloadstream filestream = gridfsbucket.opendownloadstream(file.getobjectid());
                // 创建girdfsresource,传入下载流对象,获取流对象
                gridfsresource gridfsresource = new gridfsresource(file, filestream);
                // 写入输出流
                inputstream = gridfsresource.getinputstream();
                outputstream = response.getoutputstream();
                byte[] bytes = new byte[1024];
                if (inputstream.read(bytes) != -1) {
                    outputstream.write(bytes);
                }
            }
        } catch (ioexception e) {
            logger.error("文件读取异常: {}", e.getmessage());
        } finally {
            ioutil.close(outputstream);
            ioutil.close(inputstream);
        }
    }

    /**
     * 根据objectid删除文件
     *
     * @param objectid
     * @return
     */
    @deletemapping("/remove")
    public responseentity<string> removefilebyobjectid(@requestparam("objectid") @notblank(message = "objectid不能为空") string objectid) {
        gridfstemplate.delete(new query(criteria.where("_id").is(objectid)));
        return responseentity.ok("删除成功");
    }

}

如果需要实现在浏览器页面下载此资源的功能,可结合js进行操作(文件类型根据具体业务需求而定)。主要实现代码如下所示:

    downloadnotes(noteid) {
      axios({
        url: this.base_api + '/admin/mongo/file/query/' + noteid,
        method: 'get',
        responsetype: 'arraybuffer',
        params: { type: 'download' }
      }).then(res => {
        // type类型可以设置为文本类型,这里是pdf类型
        const pdfurl = window.url.createobjecturl(new blob([res.data], { type: `application/pdf` }))
        const fname = noteid // 下载文件的名字
        const link = document.createelement('a')
        link.href = pdfurl
        link.setattribute('download', fname)
        document.body.appendchild(link)
        link.click()
        url.revokeobjecturl(pdfurl) // 释放url 对象
      })
    }

以上就是springboot整合mongodb实现文件上传下载删除的详细内容,更多关于springboot整合mongodb的资料请关注其它相关文章!