最近项目要用到文件上传下载功能,但是这些音频文件都很大,放到关系型数据库就不太好了(其实是太不好了),占内存不说还慢的要死,所以考虑使用分布式文件系统或者非关系型数据库来实现。由于分布式文件系统没有用过,怕出问题不好解决,所以最后决定使用mongodb来实现,正好框架使用的是springboot2.x,看到官方也集成了mongodb,这就再好不过了。

项目地址:https://github.com/hanxiaochuang666/mongodbDemo

简单的demo效果

最后的效果就是普通的文件上传下载的效果。ps:postman可以测试文件上传和下载,并且还能播放音频文件,厉害!!!

测试文件下载

请求连接:
http://localhost:9991/mongo/downLoadFile?id=5cfe278f71797006c862119e
返回一个音频文件,可以播放:

集成过程很简单

1、添加依赖(我的springboot版本是 2.1.5.RELEASE)

我用到了文件工具包所以导入了commons-io,如果不用这个也可以,手写response就行了

 <!--springboot集成的mongodb--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency><!--文件类的工具包--><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.4</version></dependency>

2、配置application.yml(或者application.properties)

在配置文件增加如下配置:

spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTCusername: rootpassword: rootdata:mongodb:uri: mongodb://127.0.0.1:27017/hanchuangservlet:multipart:#是否支持批量上传enabled: true#上传文件最大为 100Mmax-file-size: 100MB#上传总数据大小 200Mmax-request-size: 200MB

这里是使用的是url的形式,官方介绍:

3、controller测试类

使用的是springboot提供的模板类:GridFsTemplate


import com.hc.bootdemo.config.GridConfig;
import com.mongodb.client.gridfs.model.GridFSFile;
import org.apache.commons.io.IOUtils;
import org.bson.types.ObjectId;
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.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** @desc* @Author:hanchuang* @Version 1.0* @Date:add on 16:11 2019/6/10*/
@RestController
@RequestMapping(value = "/mongo")
public class mongoTest {@Autowiredprivate GridFsTemplate gridFsTemplate;@Autowiredprivate GridConfig gridConfig;// 音频文件上传@RequestMapping(value = "/uploadFile", method = RequestMethod.POST)public ObjectId uploadFile(@RequestParam("file") MultipartFile file) throws Exception {return gridFsTemplate.store(file.getInputStream(), file.getOriginalFilename(), file.getContentType());}// 音频文件下载@RequestMapping(value = "/getFile", method = RequestMethod.GET)public void getFile(@RequestParam(value = "id") String id,HttpServletResponse response) throws IOException {System.out.println("id================"+id);GridFSFile gridFSFile = gridFsTemplate.findOne(new Query().addCriteria(Criteria.where("_id").is(id)));GridFsResource fsResource = gridConfig.convertGridFSFile2Resource(gridFSFile);IOUtils.copy(fsResource.getInputStream(),response.getOutputStream());}@RequestMapping(value = "/deleteFile", method = RequestMethod.DELETE)public int deleteFile(@RequestParam(value = "fileName") String fileName) {gridFsTemplate.delete(new Query().addCriteria(Criteria.where("filename").is(fileName)));return 0;}
}

注意:springboot2.x时代,文件下载的时候使用的gridFsTemplate.findOne(query)返回类型由GridFSDBFile改为GridFSFile,所以下面这种方式不能用了

GridFSDBFile gridFSDBFile = gridFsTemplate.findOne(new Query().addCriteria(Criteria.where("_id").is(id)));
gridFSDBFile.writeTo(response.getOutputStream());

解决方案:把GridFSFile 转成 GridFsResource
做成一个bean配置


import com.mongodb.client.MongoDatabase;
import com.mongodb.client.gridfs.GridFSBucket;
import com.mongodb.client.gridfs.GridFSBuckets;
import com.mongodb.client.gridfs.GridFSDownloadStream;
import com.mongodb.client.gridfs.model.GridFSFile;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.gridfs.GridFsResource;
import org.springframework.stereotype.Component;import javax.annotation.Resource;/*** @desc* @Author:hanchuang* @Version 1.0* @Date:add on 17:20 2019/6/10*/
@Configuration
@Component
public class GridConfig {@Autowiredprivate MongoDbFactory mongoDbFactory;@Autowiredprivate GridFSBucket gridFSBucket;// 将GridFSFile 转成 GridFsResourcepublic GridFsResource convertGridFSFile2Resource(GridFSFile gridFsFile) {GridFSDownloadStream gridFSDownloadStream = gridFSBucket.openDownloadStream(gridFsFile.getObjectId());return new GridFsResource(gridFsFile, gridFSDownloadStream);}@Beanpublic GridFSBucket getGridFSBuckets() {MongoDatabase db = mongoDbFactory.getDb();return GridFSBuckets.create(db);}}

然后下载的时候调用一下就行了:

4、测试:

文件上传

url:http://localhost:9991/mongo/uploadFile 参数就是一个文件

选择一个MP3文件然后上传:

使用compass查看一下mongodb库里的数据,如果没有compass可以使用shell操作查看,也可以看这个文章:windows安装MongDB4.0之正确的安装姿势,最后面推荐了两个可视化工具

文件下载

url:http://localhost:9991/mongo/downLoadFile?id=5cff5293717970223c8db82c id是上传时候mongodb给返回的文件id,是自动生成的:


完。

SpringBoot2.x集成mongoDB4.0实现音频文件的上传下载功能相关推荐

  1. 文件的上传下载功能的实现(包括进度条)[telerik控件]

    文件的上传下载功能的实现(包括进度条) 1.准备工作 首先我们需要Telerik控件,数据库,上传文件文件夹. Telerik控件: RadUpload.RadProgressManager.RadP ...

  2. ssm框架验证码图片加载不出_基于SSM框架的文件图片上传/下载功能实现

    前一段时间很多做毕业设计的同学问:如何写图片和文件的上传下载功能,今天正好有时间,所以就做了一个案例,详细的讲解这个功能. 框架结构: 对于很多做过开发的而言,上传功能肯定都用过,而且用到的场景很多, ...

  3. FTP客户端--实现FTP文件的上传下载功能

    现在是2017.6.16的1点多,这几天刚好做了个FTP客户端的计网实验,就把思路过程和源码发上来吧! 一.设计思路:首先,登陆指定的FTP服务器(指定服务器的IP和用户名,密码,端口号若无就默认为2 ...

  4. Spring Boot项目集成AWS SDK连接到AWS S3,实现上传下载功能

    本文主要描写在Spring Boot项目里集成AWS SDK连接到AWS S3,实现上传下载功能的具体代码和注意事项.如有不足和错误之处,欢迎指正. AWS S3相关介绍 AWS S3(官网): ht ...

  5. ACTIVEX实现大文件FTP上传下载---上

    ACTIVEX实现大文件FTP上传 在Windows 操作系统下,有一个重要的机制,就是OLE ,就是可以让某个应用程序(OLE Controller)访问其它应用程序(OLE Server)所提供的 ...

  6. 教你如何实现c#文件上传下载功能

    简单介绍一下c#文件上传下载功能实现. NuGet 安装SqlSugar Model文件下新建 DbContext 类 public class DbContext {public DbContext ...

  7. JavaWeb实现文件上传下载功能实例解析

    转:http://www.cnblogs.com/xdp-gacl/p/4200090.html JavaWeb实现文件上传下载功能实例解析 在Web应用系统开发中,文件上传和下载功能是非常常用的功能 ...

  8. Java使用SFTP和FTP两种连接服务器的方式实现对文件的上传下载

    一.Java实现对SFTP服务器的文件的上传下载: 1.添加maven依赖: <dependency><groupId>com.jcraft</groupId>&l ...

  9. java文件流 m.jb51.net_FasfDFS整合Java实现文件上传下载功能实例详解

    今天使用Java代码实现文件的上传和下载.对此作者提供了Java API支持,下载fastdfs-client-java将源码添加到项目中.或者在Maven项目pom.xml文件中添加依赖 org.c ...

最新文章

  1. IntelliJ IDEA 新版介绍
  2. alert 回调_element之Alert 警告
  3. 全美第二的机器人项目核心数学课免费开放,院长亲自授课,作业讲义全同步...
  4. Double 与 Float 的值的比較结果
  5. Geany编辑器怎么使中文不报错?
  6. MaxCompute2.0性能评测:更强大、更高效之上的更快速
  7. 计算机组成原理第一阶段测试,计算机组成原理随堂测验1附答案
  8. 线程、进程、程序区别
  9. 大整数的因子(信息学奥赛一本通-T1171)
  10. 安卓http服务器源码,Android搭建HTTP和WebSocket的服务器端
  11. 如何实施一个BI项目(附项目管理模板)
  12. 基于51单片机定时,数码管显示时间
  13. 静态IP设置(超详细)
  14. 进口十大旋转编码器厂商
  15. Linux系统学习方法论 1
  16. 自动读取短信中心号码
  17. windows上mosquitto安装及简单使用
  18. 01-pandas时间类型dt类属性及方法
  19. OkHttp面试之--HttpEngine中的readResponse流程简介
  20. 特殊场景下的个人信息

热门文章

  1. 集合面试题(谈谈你对集合的理解?)
  2. 封装 继承 多态理解
  3. 达梦cube和rollup函数使用
  4. IBM DB2数据库实战培训课程(2天速成版)视频教程
  5. display显示属性理解
  6. matlab 线性回归 参数显著性,matlab建立多元线性回归模型并进行显著性检验及预测问题...
  7. matlab中的图像分割
  8. 欧姆龙c200he基本语言,欧姆龙C200HE-CPU11-E操作手册 - 广州凌控
  9. Flex Builder 3代码格式化方法
  10. 使用脚本巧解office安装源问题(修正版)