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的资料请关注其它相关文章!