使用MinIO文件存储系统【完成图片上传保存】业务逻辑

news/2024/11/24 12:46:49/

目录

1:业务流程

2:接口实现

controller层

service层


1:业务流程

步骤一:前端进入上传图片的界面

步骤二:上传图片,请求到后端的媒资管理服务模块

步骤三:媒资管理服务将图片文件存储到minio

步骤四:媒资管理服务记录文件信息保存到数据库

 

2:接口实现

controller层

消费者声明:媒体类型用于声明随之而来的数据的格式

创建了封装参数类:用来封装相关的参数信息

声明文件类型固定数字声明,文件大小,创建临时文件将接收到的文件拷贝到临时文件中获取临时文件的在本地的绝对路径

  @RequestMapping(value = "/upload/coursefile",consumes = MediaType.MULTIPART_FORM_DATA_VALUE)public UploadFileResultDto upload(@RequestPart("filedata") MultipartFile filedata) throws IOException {Long companyId = 1232141425L;UploadFileParamsDto uploadFileParamsDto = new UploadFileParamsDto();//图片uploadFileParamsDto.setFileType("001001");//文件名称uploadFileParamsDto.setFilename(filedata.getOriginalFilename());//文件名称//文件大小long fileSize = filedata.getSize();uploadFileParamsDto.setFileSize(fileSize);//创建临时文件File tempFile = File.createTempFile("minio", "temp");//上传的文件拷贝到临时文件filedata.transferTo(tempFile);//文件路径String absolutePath = tempFile.getAbsolutePath();//上传文件UploadFileResultDto uploadFileResultDto = mediaFilesService.uploadFile(companyId, uploadFileParamsDto, absolutePath);return uploadFileResultDto;}

service层

接口:

    UploadFileResultDto uploadFile(Long companyId, UploadFileParamsDto uploadFileParamsDto,String localFilePath);

实现类:

获取文件名称取到后缀类型获取到文件类型,生成存储minio里面的文件目录,通过文件的流生成MD5值(便于后期校验文件是否完整),拼接完整minio存储路径(存储到minio中具体的目录和md5值作为文件名称和后缀信息),调用添加文件的方法(路径,媒资类型,存储的桶,桶的文件目录),将上传的媒资信息存储到mysql表中(参数,媒资文件在minio的存储位置,文件类型,名称,md5值作为唯一标识)使用代理对象进行调用事务方法,非事务方法调用事务方法事务会失效无法回滚。

    @Overridepublic UploadFileResultDto uploadFile(Long companyId, UploadFileParamsDto uploadFileParamsDto, String localFilePath) {//获取到文件名称String filename = uploadFileParamsDto.getFilename();//获取文件后缀类型String extension = filename.substring(filename.lastIndexOf("."));//得到mimeTypeString mimeType = getMimeType(extension);//获取当前时间String folderPath = getDefaultFolderPath();File file = new File(localFilePath);if (!file.exists()) {XueChengPlusException.cast("文件不存在");}//获取文件的md5值String fileMd5 = getFileMd5(file);//得到ObjectNameString ObjectName = folderPath+fileMd5+extension;//上传文件boolean flag = addMediaFilesToMinIO(localFilePath, mimeType, BUCKET_FILES, ObjectName);if (!flag){XueChengPlusException.cast("上传文件失败");}//文件大小uploadFileParamsDto.setFileSize(file.length());//将文件信息存储到数据库MediaFiles mediaFiles = currentProxy.addMediaFilesToDb(companyId, fileMd5, uploadFileParamsDto,BUCKET_FILES,ObjectName);//准备返回数据UploadFileResultDto uploadFileResultDto = new UploadFileResultDto();BeanUtils.copyProperties(mediaFiles, uploadFileResultDto);return uploadFileResultDto;}

抽取拓展名方法:

    /*** 抽取扩展名* @param extension* @return*/private String getMimeType(String extension){if(extension==null) {extension = "";}//根据扩展名取出mimeTypeContentInfo extensionMatch = ContentInfoUtil.findExtensionMatch(extension);//通用mimeType,字节流String mimeType = MediaType.APPLICATION_OCTET_STREAM_VALUE;if(extensionMatch!=null){mimeType = extensionMatch.getMimeType();}return mimeType;}

获取当前时间点抽取方法(存储文件的路径):

    //获取文件默认存储目录路径 年/月/日private String getDefaultFolderPath() {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");String folder = sdf.format(new Date()).replace("-", "/")+"/";return folder;}

抽取添加的文件方法:

    /*** @description 将文件写入minIO* @param localFilePath  文件地址* @param bucket  桶* @param objectName 对象名称*/public boolean addMediaFilesToMinIO(String localFilePath,String mimeType,String bucket, String objectName) {try {UploadObjectArgs testbucket = UploadObjectArgs.builder().bucket(bucket).object(objectName).filename(localFilePath).contentType(mimeType).build();minioClient.uploadObject(testbucket);log.debug("上传文件到minio成功,bucket:{},objectName:{}",bucket,objectName);System.out.println("上传成功");return true;} catch (Exception e) {e.printStackTrace();log.error("上传文件到minio出错,bucket:{},objectName:{},错误原因:{}",bucket,objectName,e.getMessage(),e);XueChengPlusException.cast("上传文件到文件系统失败");}return false;}

添加文件信息到mysql中记录相关信息

调用处理任务的方法中(在等待处理的方法中如果上传的文件类型是视频类型,保存媒资信息到待处理的任务表中)。

    /*** @description 将文件信息添加到文件表* @param companyId  机构id* @param fileMd5  文件md5值* @param uploadFileParamsDto  上传文件的信息* @param bucket  桶* @param objectName 对象名称*/@Transactionalpublic MediaFiles addMediaFilesToDb(Long companyId,String fileMd5,UploadFileParamsDto uploadFileParamsDto,String bucket,String objectName){//从数据库查询文件MediaFiles mediaFiles = baseMapper.selectById(fileMd5);if (mediaFiles == null) {mediaFiles = new MediaFiles();//拷贝基本信息BeanUtils.copyProperties(uploadFileParamsDto, mediaFiles);mediaFiles.setId(fileMd5);mediaFiles.setFileId(fileMd5);mediaFiles.setCompanyId(companyId);mediaFiles.setUrl("/" + bucket + "/" + objectName);mediaFiles.setBucket(bucket);mediaFiles.setFilePath(objectName);mediaFiles.setCreateDate(LocalDateTime.now());//审核通过mediaFiles.setAuditStatus("002003");mediaFiles.setStatus("1");//保存文件信息到文件表int insert = baseMapper.insert(mediaFiles);if (insert < 0) {log.error("保存文件信息到数据库失败,{}",mediaFiles.toString());XueChengPlusException.cast("保存文件信息失败");}//添加到待处理任务表中addWaitingTask(mediaFiles);log.debug("保存文件信息到数据库成功,{}",mediaFiles.toString());}return mediaFiles;}


http://www.ppmy.cn/news/70813.html

相关文章

【大数据学习篇7】小试牛刀统计并且分析天猫数据

本项目基于搭建大数据环境&#xff0c;通过将数据存放在HDFS上&#xff0c;从HDFS中获取数据&#xff0c;然后根据实际需求通过Spark或Spark SQL对数据进行读取分析&#xff0c;将分析结果存储到HBase表中&#xff0c;最终通过 ECharts数据可视化工具基于Python Web平台实现数据…

Requests-get方法的使用

Requests-get方法使用 打开网页使用代码获取页面内容查看结果页面格式修改 爬取书名完整代码以及注释代码注释 翻页查询所有 以https://books.toscrape.com/网站为例&#xff1a; 打开网页 先把网页打开&#xff0c;然后右键检查&#xff0c;找到网络一栏&#xff0c;这个时候…

前端实现可拖拽课程表【纯HTML、CSS、JS】

前言 hello&#xff0c;今天实现点小动画&#xff0c;帮助学习理解Web api的拖拽效果&#xff0c;这里实现的是可拖拽的课程表&#xff01;# 效果图 附&#xff1a;作者没钱去除水印&#xff0c;就这样看一下简单的看一下效果吧&#xff01; 实现前言知识 这里我使用事件委…

怎么制作网站?手把手教你10个网站建设的步骤!

怎么制作网站&#xff1f;手把手教你10个网站建设的步骤&#xff01;网站建设需要进行10个步骤&#xff0c;首先要确定网站建设的目标&#xff0c;考虑用户、品牌信息和竞争对手等&#xff0c;避免方向错误。其次&#xff0c;绘制网站建设地图和原型&#xff0c;确定位置大小、…

ThreadLocal什么时候会出现OOM的情况

ThreadLocal什么时候会出现OOM的情况&#xff1f;为什么&#xff1f; ThreadLocal变量是维护在Thread内部的&#xff0c;这样的话只要我们的线程不退出&#xff0c;对象的引用就会 一直存 在。当线程退出时&#xff0c;Thread类会进行一些清理工作&#xff0c;其中就包含Th…

Java进阶-字符串的使用

1.API 1.1API概述 什么是API ​ API (Application Programming Interface) &#xff1a;应用程序编程接口 java中的API ​ 指的就是 JDK 中提供的各种功能的 Java类&#xff0c;这些类将底层的实现封装了起来&#xff0c;我们不需要关心这些类是如何实现的&#xff0c;只需要…

js对map排序,后端返回有序的LinkedHashMap类型时前端获取后顺序依旧从小到大的解决方法

js对map排序&#xff0c;后端返回有序的LinkedHashMap类型时前端获取后顺序依旧从小到大的解决方法 js对map排序&#xff0c;后端返回有序的LinkedHashMap类型时前端获取后顺序依旧从小到大的解决方法 [{"2020": [{"id": 39,"createTime": &quo…

hive之DML操作

目录 Load: 语法&#xff1a; load实例&#xff1a; Insert: 查询&#xff1a; Limit语句&#xff1a; 案例1&#xff1a; 案例2&#xff1a; 关系运算函数&#xff1a; 1&#xff09;基本语法 逻辑运算符&#xff1a; 1&#xff09;基本语法&#xff08;and/or/not…