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

news2024/11/19 8:53:30

目录

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值作为唯一标识)使用代理对象进行调用事务方法,非事务方法调用事务方法事务会失效无法回滚。

    @Override
    public UploadFileResultDto uploadFile(Long companyId, UploadFileParamsDto uploadFileParamsDto, String localFilePath) {
        //获取到文件名称
        String filename = uploadFileParamsDto.getFilename();
        //获取文件后缀类型
        String extension = filename.substring(filename.lastIndexOf("."));
        //得到mimeType
        String mimeType = getMimeType(extension);
        //获取当前时间
        String folderPath = getDefaultFolderPath();
        File file = new File(localFilePath);
        if (!file.exists()) {
            XueChengPlusException.cast("文件不存在");
        }
        //获取文件的md5值
        String fileMd5 = getFileMd5(file);
        //得到ObjectName
        String 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 = "";
        }
        //根据扩展名取出mimeType
        ContentInfo 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 对象名称
     */
    @Transactional
    public 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.coloradmin.cn/o/543183.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32---编写呼吸灯串口发送ON开LED,发送OFF关LED或者0X550X440XFF表示开灯,0X550X660XFF表示关灯

编写呼吸灯串口发送ON开LED&#xff0c;发送OFF关LED或者&#xff08;0X550X440XFF表示开灯&#xff0c;0X550X660XFF表示关灯&#xff09;注&#xff1a;包头 0X55 包尾&#xff1a;0XFF 数据&#xff1a;0X44表示开灯 0X66表示关灯 用到了重定向 //printf的重定向 int fpu…

使用SSD会提高游戏性能或FPS吗?

​“我在考虑要不要给电脑换个SSD&#xff0c;现在旧电脑上的HDD快满了&#xff0c;正好我也喜欢打游戏&#xff0c;听说换SSD可以提高电脑性能以及游戏FPS&#xff0c;这是真的吗&#xff1f;如果是真的&#xff0c;那我怎么样可以把旧硬盘上的数据迁移到新硬盘呢&#xff1f;…

【Web3.0大势所趋】下一代互联网的未来

前言 Web3.0 是一个越来越受到关注的话题&#xff0c;它被认为将会带来天翻地覆的变化。本文我们一起来谈谈 Web3.0 的概念、特点和优势&#xff0c;并探讨它为什么如此重要和具有革命性的。 文章目录 前言Web3.0是什么区块链技术智能合约总结 Web3.0是什么 Web3.0: 是下一代互…

达梦数据库的安装DM8

文章目录 一、达梦数据库的安装1、环境需求2、达梦的官方安装文档3、达梦数据库的安装包下载3.1、DM8的下载3.2、DM7的下载 4、开始操作4.1、使用xftp传dm8到虚拟机里4.2、下载依赖包4.3、拷贝dm8的iso文件到指定目录&#xff0c;并挂载4.4、创建DM安装用户和安装用户组并初始化…

提前熟知领英被限制被封因素,避免踩坑

领英在什么情况下容易被封 01.同一个人注册使用多个领英帐号。 02.多个人共同使用同一个领英帐号。 03.虚假资料注册领英账号&#xff0c;常见于注册领英账号的时候初始姓名随便填写或胡编乱造&#xff0c;注册时使用了网络虚拟的手机号码或邮箱等。 04.领英帐号的个人档案资料…

unity多线程Burst+Job System

Unity自己本身UnityEngine所使用的API是不能被多线程调用的&#xff0c;它没有向用户开放线程接口&#xff0c;所以Unity是不能使用多线程的&#xff0c;但是C#中可以使用多线程&#xff0c;Unity使用C#进行脚本编辑&#xff0c;故而Unity也可以通过C#来调用多线程。 JobSyste…

如何在新能源行业运用IPD?

新能源又称非常规能源&#xff0c;一般指在新技术基础上&#xff0c;可系统地开发利用的可再生能源。是指传统能源之外的各种能源形式&#xff0c;也是指刚开始开发利用或正在积极研究、有待推广的能源&#xff0c;如太阳能、地热能、风能、海洋能、生物质能和核聚变能等。目前…

HTTP与HTTPS的区别

1 HTTP与HTTPS有哪些区别 HTTP 是超文本传输协议&#xff0c;信息是明文传输&#xff0c;存在安全风险的问题。HTTPS 则解决 HTTP 不安全的缺陷&#xff0c;在 TCP 和 HTTP 网络层之间加入了 SSL/TLS 安全协议&#xff0c;使得报文能够加密传输。HTTP 连接建立相对简单&#x…

你的私人编程老师,ChatGPT帮你快速掌握Python编程

ChatGPT为我们提供了一种全新的学习方式&#xff0c;让你可以更轻松&#xff0c;更快速地学习编程知识。 以下是ChatGPT帮助用户学习编程的优势&#xff1a; 推荐资源和课程ChatGPT可以根据您的编程经验和学习目标&#xff0c;推荐适合您的在线学习资源和课程。例如&#xff0c…

Go类型断言

在Go语言中类型断言的语法格式如下&#xff1a; value, ok : x.(T) 类型断言失败&#xff0c;不会发生panic。根据ok判断是否成功 或者 value: x.(T) 类型断言失败&#xff0c;会发生panic 其中&#xff0c;x 表示一个接口的类型&#xff0c;T 表示一个具体的类型&#xff08;也…

希望所有计算机专业同学都知道这些老师

C语言教程——翁凯老师、赫斌 翁恺老师是土生土长的浙大码农&#xff0c;从本科到博士都毕业于浙大计算机系&#xff0c;后来留校教书&#xff0c;一教就是20多年。 翁恺老师的c语言课程非常好&#xff0c;讲解特别有趣&#xff0c;很适合初学者学习。 郝斌老师的思路是以初学…

进口常用除氟树脂品牌

随着经济的发展&#xff0c;半导体、表面处理、采矿等行业产生了大量的高氟废水&#xff0c;由于高氟水对人体健康具有较大危害&#xff0c;含氟污水治理己经引起了广泛的关注。 多年以前&#xff0c;含氟废水的处理&#xff0c;一般下游污水处理厂通过合并多股废水&#xff0…

html监听界面被隐藏或显示

vue相比于小程序和uni-app 显然少了两个有点用的生命周期 onShow 应用被展示 onHide 应用被隐藏 但其实这个 要做其实也很简单 JavaScript中 有对应的visibilitychange事件可以监听 我们Html参考代码如下 <!DOCTYPE html> <html lang"en"> <head>…

在GB28181项目中,调用eXosip_register_send_register函数并且返回值为-2或者-3的含义是什么

一、eXosip_register_send_register返回-2的原因&#xff1a; 在GB28181项目中&#xff0c;调用eXosip_register_send_register函数并且返回值为-2通常表示注册发送失败。该返回值的含义是注册请求被拒绝&#xff0c;可能是由于身份验证失败或其他原因导致的。 以下是可能导致…

人车混合机器人实现身体平衡功能

1. 功能说明 在R035c样机上安装一个六轴陀螺仪传感器&#xff0c;本文示例将实现机器人身体平衡功能。当用手把机器人人形部分摆动到左侧时&#xff0c;人形部分会自动恢复到中间&#xff1b;当用手把机器人人形部分摆动到右侧时&#xff0c;人形部分也会自动恢复到中间。 ​ 2…

简历照片底色要求是什么?怎么修改证件照底色?

准备一份完美的简历是找到工作的关键之一。其中一个重要的组成部分是照片。照片可以让我们的简历更加生动活泼&#xff0c;同时也可以为面试官在面试时提供更好的印象。但是&#xff0c;如果在照片中使用了错误的背景色&#xff0c;那么简历可能会被忽略或被视为不专业。因此&a…

数据结构与算法——求二叉树叶子数量求二叉树高度

递归特性求树的高度流程图 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <stdlib.h> //二叉树的节点结构体 struct BinaryNode {char ch;//显示的字母struct BinaryNode * lChild;//左孩子struct BinaryNode * rChil…

代码随想录训练营Day45| 70. 爬楼梯 (进阶) 322. 零钱兑换 279.完全平方数

目录 学习目标 学习内容 70. 爬楼梯 &#xff08;进阶&#xff09; 322. 零钱兑换 279.完全平方数 学习目标 70. 爬楼梯 &#xff08;进阶&#xff09; 322. 零钱兑换 279.完全平方数 学习内容 70. 爬楼梯 &#xff08;进阶&#xff09; problems/0070.爬楼梯完全背包版本…

用ChatGPT创作小说,根据不同情境设定做多线推进

小说根据不同情境设定做多线推进 我们在读小说、看影视剧时&#xff0c;经常会有这样那样的遗憾&#xff1a;这里主角怎么没有吻上去呢&#xff1f;为什么不能给个大团圆结局呢&#xff1f;再仔细找找就能发现宝藏了啊&#xff01;等等等等……在网剧领域&#xff0c;已经开始…

gRPC-go参数功能介绍总结目录

本篇文章是gRPC-go框架的参数功能介绍总结 本篇文章的目的&#xff1a; 查看快速方便查询gRPC-go都有哪些参数可用&#xff01;可以快速的查询到相关案例&#xff01; gRPC-go版本是v1.30.0 可以从下面的地址下载gRPC-go版本 链接: https://pan.baidu.com/s/1za02qnUII78n-…