技术回顾day2

1.获取文件列表

流程:前端根据查询条件封装查询信息,后端接收后进行封装,封装为FileInfoQuery,根据fileInfoQuery使用mybatis的动态sql来进行查询。

2.文件分片上传

每次上传需要上传包括(文件名字,文件,md5值,父文件id,当前是哪一个分块,总的分块数量)
流程:

       第一次上传的时候后端生成fileId(后续返回给前端,后面的分片都会带上这个fileId)。

       秒传逻辑:

         当chunk = 0,也就是第一个分片,会先拿着md5去数据库里面里面进行查询,如果查询的数据不为空,那么就可以秒传。秒传前先从redis里面获取用户的空间是否满足,不满足就抛出异常,空间充足就构造文件信息插入到数据库中,接着更新用户的空间,返回上传成功的状态信息(秒传)。

        正常逻辑(不能秒传):

        首先判断用户空间是否足够插入当前的分片,不够的话抛出异常。接着构建临时目录(由用户id和fileId构成),创建临时文件(命名规则是当前的chunk值),使用File.copy来进行文件的复制(在这里可以使用我们的限流器)。上传成功后,将已经保存的临时文件的大小存储在redis当中方便后面判断空间是否充足。
        如果当前上传后不是最后一个分片,那么返回状态为上传中,前端会继续发请求。
        如果最后一个分片上传完成,构架file信息,根据redis中临时文件的大小来更新用户已使用空间。返回状态信息为上传完成。如果中间文件上传失败,在finally中删除临时文件。
        当事物提交完成之后,异步的合并文件。

        异步合并的流程:

                判断数据库中是否已经正常插入,如果没有插入直接返回。构建真实文件路径和文件名,使用 RandomAccessFile来进行文件的合并并且产出源文件(临时文件)。接着根据文件的类型判断是否是视频或者图片,如果是视频对视频进行切割,生成缩略图。如果是图片生成缩略图。

                在finally根据根据一个transferSuccess字段判断是否合并成功,如果合并失败就更改数据库为转码失败状态,否则就更改为使用中的状态。
 

知识点:

怎么实现事物提交后才开始异步合并?

Spring 提供的 事务同步管理器,用于管理事务的回调机制。
它允许开发者在事务的不同阶段(提交前、提交后、回滚后等)执行额外的操作。

TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {@Overridepublic void afterCommit() {fileInfoService.transferFile(fileInfo.getFileId(), webUserDto);}});

异步是怎么实现的:

@async注解实现异步合并,他的原理是aop,当调用这个方法的时候,其实是调用的代理方法,将其放到默认线程池中执行。
但是不推荐使用默认线程池,所以可以自定义线程池。

因为当前的项目中异步合并包括合并文件和图片压缩,视频处理。所以定义的线程池的核心线程数是(cpu核心数),最大线程数是(cpu核心数*2),并使用有界队列来作为任务队列。


RandomAccessFile实现文件合并:

RandomAccessFile 是 Java 中用于随机访问文件的类,它允许直接跳转到文件的任意位置进行读写操作(类似操作内存中的数组),而不是像普通 InputStream/OutputStream 那样只能顺序读写。

使用ffmpeg来进行视频切割和图片缩略图生成:
核心代码
  1. 创建切片目录

    • 根据原始视频文件名,创建一个同名目录(例如 video.mp4 对应 video/ 目录),用于存放切片文件。
  2. 检测视频编码格式

    • 使用 ffprobe 检测视频的编码格式(如 H.264、H.265/HEVC)。
    • 如果视频是 ​HEVC(H.265)编码,则先将其转码为 ​H.264 编码​(因为某些播放器不支持 H.265)。
  3. 生成中间 TS 文件

    • 通过 ffmpeg 将视频转换为 ​TS 格式​(MPEG-TS,流媒体常用容器格式)。
  4. 切割 TS 文件并生成索引

    • 将 TS 文件按 ​30秒一段 切割成多个小切片(如 xxx_0001.tsxxx_0002.ts)。
    • 生成 .m3u8 索引文件,记录所有切片的顺序和路径。
  5. 清理临时文件

    • 删除中间生成的完整 TS 文件(仅保留切片和索引)。
怎么执行的cmd命令:

        从网上找的一个工具类进行封装ProcessUtils。

3.读取图片

 String contentType = "image/" + imageSuffix;
//设置响应头,表示是图片,防止被当作二进制文件下载response.setContentType(contentType);
//让浏览器或者cdn进行缓存,后续可以直接查询缓存response.setHeader("Cache-Control", "max-age=2592000");


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/75273.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/75273.shtml

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

相关文章

DeepSeek-R1 模型现已在亚马逊云科技上提供

2025年3月10日更新—DeepSeek-R1现已作为完全托管的无服务器模型在Amazon Bedrock上提供。 2025年2月5日更新—DeepSeek-R1 Distill Llama 和 Qwen模型现已在Amazon Bedrock Marketplace和Amazon SageMaker JumpStart中提供。 在最近的Amazon re:Invent大会上,亚马…

STP --- 生成树协议

协议信息 配置 BPDU Protocol identifier:协议标识 Version:协议版本:STP 为 0,RSTP 为 2,MSTP 为 3 type: BPDU 类型 Flag: 标志位 Root ID: 根桥 ID,由两字节的优…

Ansible playbook-ansible剧本

一.playbook介绍 便于功能的重复使用 本质上就是文本文件,一般都是以.yml结尾的文本文件。 1.遵循YAML语法 1.要求同级别代码要有相同缩进,建议4个空格。【同级别代码是同一逻辑的代码】 在计算机看来空格和Tob键是两个不同的字符。 2.一个键对应一…

python的基础入门

初识Python 什么是Python Python是1门程序设计语言。在开发者眼里,语言可以分为3类: 自然语言:人能听懂的语言,例如汉语,英语,法语等等。机器语言:机器能听懂的语言,机器只能听懂0…

MD编辑器中的段落缩进怎么操作

在 Markdown(MD)编辑器中,段落的缩进通常可以通过 HTML 空格符、Markdown 列表缩进、代码块缩进等方式 实现。以下是几种常见的段落缩进方法: 1. 使用全角空格 ( ) 在一些 Markdown 编辑器(如 Typora)中&…

8.neo4j图数据库python操作

使用图数据库的原因 图数据库使用neo4j的原因:neo4j使用率高,模板好找,报错能查。 红楼梦人物关系图地址 GraphNavigator neo4j学习手册 https://www.w3cschool.cn/neo4j/neo4j_need_for_graph_databses.html CQL代表的是Cypher查询语言…

[Lc6_记忆化搜索] 扫雷游戏 | 理解 递归vs记忆化搜索vs dp

目录 ⭕1.扫雷游戏 题解 1.记忆化搜索 解法一:递归 解法二:记忆化搜索 解法三:动态规划 ⭕1.扫雷游戏 (暴力模拟) 链接:529. 扫雷游戏 让我们一起来玩扫雷游戏! 给你一个大小为 m x n 二维字符矩阵…

云原生周刊:Kubernetes v1.33 要来了

开源项目推荐 Tekton Tekton 是一个开源的 K8s 原生 CI/CD 系统,它为构建、测试和部署自动化工作流提供了强大而灵活的框架。Tekton 提供了一套标准化的 API 和自定义资源(CRDs),使得开发者能够在 K8s 集群中定义和管理 CI/CD 管…

服务新增节点、迁移笔记

文章目录 基础配置部分基础配置-hosts基础配置-jdk包准备基础配置-jdk环境变量配置基础配置-skywalking包 基础配置-apollo配置。 # 文件夹及配置基础配置-tomcat基础配置-nginx基础配置部分-磁盘挂载(这个也差点漏掉)。 防火墙部分防火墙部分-数据库及脚本防火墙部分-redis防火…

第十一章:Python PIL库-图像处理

一、PIL库简介 PIL(Python Imaging Library)是一个功能强大的图像处理库,它提供了丰富的图像处理功能,包括图像的打开、处理和保存等操作。PIL支持多种图像文件格式,如JPEG、PNG、BMP等,并且可以完成对图像…

【编译、链接与构建详解】Makefile 与 CMakeLists 的作用

【编译、链接与构建详解】Makefile 与 CMakeLists 的作用 前言源代码(.c、.cpp)编译编译的本质编辑的结果编译器(GCC、G、NVCC 等) 目标文件(.o)什么是 .o 目标文件为什么单个 .o 目标文件不能直接执行&…

Ubuntu / Debian 创建快捷方式启动提权

简述 在 Linux 系统中,.desktop 文件是 桌面入口文件,用于在桌面环境(如 GNOME、KDE)中定义应用程序的启动方式、图标、名称等信息。当你执行 touch idea.desktop 时,实际上创建了一个空的 .desktop 文件(…

ISIS报文

IS-IS 报文 目录 IS-IS 报文 一、报文类型与功能 二、报文结构解析 三、核心功能特性 四、典型应用场景 五、抓包数据分析 六、总结 IS-IS(中间系统到中间系统)协议报文是用于链路状态路由协议中网络设备间交换路由信息的关键载体,其设…

beikeshop多商户跨境电商独立站最新版v1.6.0版本源码

一.介绍 beikeshop跨境电商独立站最新版V1.6.0源码 多商户 多商家 多语言 多币结算 本博主亲测搭建代码全开源质量相对来说很稳定的 二.服务器环境 系统:CentOS、 环境:PHP7.4 Nginx 1.21 MySQL 5.6 常见插件:fileinfo ; re…

Redis批量操作详解

一、原生批量命令(MSET) 适用场景:所有键的过期时间相同或无过期设置,且无需条件判断。 方法: 将多个SET命令合并为MSET命令,但需要注意MSET的局限性(无法设置过期时间,且所有键值对…

Spring Boot 集成实战:AI 工具如何自动生成完整微服务模块

在数字化转型的浪潮中,开发效率和质量是企业竞争力的关键要素。飞算 JavaAI 作为一款创新的 AI 工具,能在 Spring Boot 开发中,自动生成完整微服务模块,极大提升开发效率。下面,我们就详细介绍如何借助飞算 JavaAI&…

算法 | 2024最新算法:斑翠鸟优化算法原理,公式,应用,算法改进研究综述,matlab代码

基于斑翠鸟优化算法的原理、应用及改进研究综述 一、算法原理 斑翠鸟优化算法(Pied Kingfisher Optimizer, PKO)是2024年由Bouaouda等人提出的一种新型仿生智能优化算法,其灵感来源于斑翠鸟的捕食行为与共生关系。算法通过模拟斑翠鸟的栖息悬停、潜水捕鱼及与其他生物的共生…

RabbitMQ高级特性--重试特性

目录 1.重试配置 2.配置交换机&队列 3.发送消息 4.消费消息 5. 运行程序观察结果 6. 手动确认 注意: 在消息传递过程中, 可能会遇到各种问题, 如网络故障, 服务不可用, 资源不足等, 这些问题可能导致消息处理失败. 为了解决这些问题, RabbitMQ 提供了重试机制, …

Vue 组件通信 - 中央事件总线

Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue组件通信 - 中央事件总线 目录 中央事件总线 图示 准备工作 设置页面元素 创建组件 总结 中央事件总线 使用vue的监听和触发来实现中央事件总线方式。 on监听 emit触发,组件按钮绑定点击事件&#xff0c…

5.0 WPF的基础介绍1-Grid,Stack,button

WPF: Window Presentation Foundation. WPF与WinForms的对比如下: 特性WinFormsWPF技术基础基于传统的GDI(图形设备接口)基于DirectX,支持硬件加速的矢量渲染UI设计方式拖拽控件事件驱动代码(简单但局限)…