技术回顾day3

news2025/5/15 14:51:30

1.获取文件信息、获取视频信息

走的都是同一个方法:baseController里面的getFile。

在getFile方法里面进行判断文件的类型,判断是不是m3u8类型或者ts类型做一些额外的处理。

获取信息底层就是读取文件,然后写入response的OutputStream

out = response.getOutputStream();

            File file = new File(filePath);
            if (!file.exists()) {
                return;
            }
            in = new FileInputStream(file);
            limitInputStream = new LimitInputStream(in,new BandwidthLimiter(1024));
            byte[] byteData = new byte[1024];
            out = response.getOutputStream();
            int len = 0;
            while ((len = limitInputStream.read(byteData)) != -1) {
                out.write(byteData, 0, len);
            }
            out.flush();

在readFile的时候要做一些校验,防止用户输入类似“../”这种目录从而访问到我们的其他信息
 

2.新建文件夹

流程:

        根据传入的文件名和父目录id(pid)查询是否有同名文件夹,如果没有才能插入数据库。本项目在插入之后又进行了一次校验(校验目录数量是否大于2),是为了防止高并发的插入。
防止高并发也可以加锁。

加锁的话这里延伸一下。

        加锁在方法上(synchronized)的时候,锁住的是调用当前方法的对象,我们Bean一般是单例模式,所以锁住这个Bean对象之后其他用户调用这个方法也会串行执行(严重影响效率)。
所以我们应该根据用户Id加锁,或者使用分布式锁。

再说一下synchronize在代理下的问题:

        当我们在方法上加入了@async或者@transaction这些注解,他们是使用aop实现的,底层用到了动态代理,所以,我们其实拿到的是代理对象,调用的方法是代理对象的方法,此时如果方法里是使用synchronized(this)这种方法加锁,那么锁就会在事物提交之前就释放那么可能就会引起并发安全问题。

可以看一下下图里面fileInfoService的名字,可以看出是被代理过的对象。

3.批量移动文件

流程:

  1. 参数校验阶段

    • 检查要移动的文件ID列表(fileIds)是否与目标文件夹ID(filePid)相同,防止将文件移动到自身位置
    • 如果目标文件夹不是根目录(filePid ≠ 0),则验证该文件夹是否存在且有效
  2. 准备目标文件夹数据

    • 将文件ID字符串拆分为数组(fileIdArray
    • 查询目标文件夹下现有的所有文件,并转换为以文件名为键的Map结构,用于快速查找
  3. 获取待移动文件列表

    • 根据用户ID和文件ID数组,查询出所有需要移动的文件信息
  4. 执行文件移动操作

    • 遍历待移动文件列表,对每个文件:
      • 检查目标文件夹中是否已存在同名文件
      • 如果存在同名文件,则自动生成新的文件名(重命名)
      • 更新文件的父目录ID为目标文件夹ID
      • 如果文件名冲突,则使用新生成的文件名
  5. 事务保障

    • 整个操作过程在事务管理下进行,确保所有文件移动操作要么全部成功,要么全部回滚
  6. 异常处理

    • 在参数校验和文件夹验证阶段,如果发现异常情况(如无效的目标文件夹),立即抛出业务异常终止操作

4.下载文件实现

流程:下载分为两步:获取下载链接(就是从后端获取一个code,这一步做登录校验)、根据code来真正的下载文件(不校验登录)。

为什么要分为两步:

        如果浏览器集成了第三方插件,如果只有一个下载接口我们又希望校验(登录)之后才能下载,那么第三方插件拿不到我们的登录数据就不能实现下载功能。

获取下载链接流程:

        校验如果是文件夹不允许下载,根据fileId和userId查询是否存在该文件,存在的话生成一个50位的随机字符串(code)。将这个code作为key,文件的路径和名字作为value,保存到redis中并设置过期时间。

下载文件流程:

从redis中获取文件的路径和名字,设置http响应头

  • ​**Content-Type**:声明文件为可下载类型(application/x-msdownload
  • ​**Content-Disposition**:强制浏览器下载而非预览,并指定文件名



 

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

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

相关文章

埃文科技企业AI大模型一体机——昇腾体系+DeepSeek+RAG一站式解决方案

面对企业级市场海量数据资产与复杂业务场景深度耦合的刚需,埃文科技重磅推出基于华为昇腾算力DeepSeek大模型的企业一体机产品,提供DeepSeek多版本大模型一体机选择,为企业提供本地昇腾算力DeepSeek大模型RAG知识库的一体化解决方案&#xff…

JavaWeb开发基础知识-Servlet终极入门指南(曼波萌新版)

(✪▽✪)曼波~~~~!欢迎来到Servlet新手村!准备好开启Web开发的奇妙冒险了吗?让曼波用最有趣的方式带你飞~ 🚀 🌈 第①章 什么是Servlet? // 本质就是一个Java类! public class HelloServlet e…

游戏引擎学习第198天

回顾并为今天的内容设定 今天我们有一些代码需要处理。昨天我们进行了一些调试界面的整合工作,之前我们做了一些临时的、粗糙的操作,将一些东西读进来并放到调试界面中。今天,我们并不打算进行大规模的工作,更多的是对之前的代码…

Walrus 基金会启动 RFP 计划,推动生态发展

Walrus 基金会正式推出 Walrus RFP 提案申请计划,为推动和支持 Walrus 生态的项目提供资金支持。该计划旨在助力构建符合协议使命的解决方案,解锁去中心化和可编程存储的潜力。 无论项目是开发新工具、探索集成,还是提出创新用例&#xff0c…

智能配电箱:重塑未来电力管理的核心枢纽

哇塞!智能配电箱可是未来电力管理的超级核心枢纽呀,正以超燃的态势引领着电力行业迈向智能化变革的新征程呢!它在众多方面所展现出的独特优势和那广阔无垠的应用前景,简直太令人激动啦!下面就来瞧瞧智能配电箱在重塑未…

透过 /proc 看见内核:Linux 虚拟文件系统与 systemd 初始化初探

当我们在终端中输入 ps、top、cat /proc/cpuinfo 等命令时,是否思考过这些信息来自哪里?为什么无需启动任何守护进程,就能实时读取系统负载、内存占用,甚至内核版本?这一切的答案,都藏在 Linux 系统中的一个…

用DrissionPage升级维基百科爬虫:更简洁高效的数据抓取方案

一、原方案痛点分析 原代码使用urllibBeautifulSoup组合存在以下问题: 动态内容缺失:无法获取JavaScript渲染后的页面内容 反爬能力弱:基础请求头易被识别为爬虫 代码冗余:需要单独处理SSL证书验证 扩展性差:难以应…

C++STL——容器-vector(含部分模拟实现,即地层实现原理)(含迭代器失效问题)

目录 容器——vector 1.构造 模拟实现 2.迭代器 模拟实现: ​编辑 3.容量 模拟实现: 4.元素的访问 模拟实现 5.元素的增删查改 迭代器失效问题: 思考问题 【注】:这里的模拟实现所写的参数以及返回值,都是…

严重BUG修复及部分体验问题优化

随着Deepseek APIPython 测试用例一键生成与导出 V1.0.6的试用不断深入,会出现程序异常崩溃的问题。经群友定位,紧急修复了bug,并适当优化部分体验性问题。针对生成的测试用例xlsx文档,可以再次选中该xlsx给大模型进行推理生成新的…

Elasticsearch 证书问题解决

报错信息 javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested targetat org.elasticsearch.client.RestClient. extractAndWrapCause(R…

2023年CIE SCI1区TOP:序列融合麻雀搜索算法ISSA,深度解析+性能实测

目录 1.摘要2.麻雀搜索算法SSA原理3.改进策略3.结果展示4.参考文献5.代码获取 1.摘要 麻雀搜索算法(SSA)是一种基于麻雀觅食和防捕行为的群体智能算法。然而,基本SSA在迭代过程中,种群多样性逐渐降低,容易陷入局部最优…

配置晟腾910b的PyTorch torch_npu环境

1.【新教程】华为昇腾NPU的pytorch环境搭建 - Lukea - 博客园 1、新建conda环境。 conda create -n pytorch python3.102、在新建好的conda环境中,安装基础的依赖。 pip install attrs cython numpy1.24.0 decorator sympy cffi pyyaml pathlib2 psutil protobuf…

conda 激活环境vscode的Bash窗口

多份conda环境注意事项,当时安装了两个conda环境,miniconda和conda,导致环境总是冲突矛盾。初始化时需要更加注意。 $ C:/Users/a_hal/miniconda3/Scripts/conda.exe init bash能够显示用哪里的conda环境命令执行。 然后直接conda activate…

火山 RTC 引擎 2 ----APPKEY

前篇文章:火山RTC引擎 --一次失望的体验 那个DEMO可以编译运行了,但是功能不能用, 一用就崩溃。 主要原因还是没有APPKEY 一、火山引擎 APPKEY 管理 1、登录后台 账号登录-火山引擎欢迎登录火山引擎,火山引擎是字节跳动旗下的云…

Springboot学习笔记3.28

目录 实战第六课:文章分类开发 新增文章分类: 具体实现: 查询文章分类: 具体实现: 获取文章分类的详情 更新文章分类: 注意点: ​编辑 对校验规则进行分组: 学习时的疑惑…

【CSS3】05-定位 + 修饰属性

本文介绍定位和CSS中的修饰属性。 目录 1. 定位 1.1 相对定位 1.2 绝对定位 1.3 定位居中 1.4 固定定位 1.5 z-index堆叠层级 2. 修饰属性 2.1 垂直对齐方式 vertical-align 2.2 过渡属性 2.3 透明度 opacity 2.4 光标类型 cursor 1. 定位 灵活改变盒子在网页中的位…

如何屏蔽mac电脑更新提醒,禁止系统更新

最烦mac的系统更新提醒了,过几天就是更新弹窗提醒,现在可以直接禁掉了,眼不见心不乱,不然一升级,开发环境全都不能用了,那才是最可怕的,屏蔽的方法也很简单,就是屏蔽mac系统更新的请…

Rclone同步Linux数据到google云盘

文章目录 Rclone管理云存储Rclone安装和使用说明安装rclone配置rclone连接到云盘基本备份命令高级备份选项自动化备份加密备份(可选)恢复数据常见云存储服务名称注意事项 googleCloud 平台中操作OAuth权限请求页面(OAuth同意屏幕)…

AI人工智能-Jupyter NotbookPycharm:Py开发

安装 命令: pip install jupyter 启动 命令: jupyter notebook 启动成功后,下面网址会默认自动打开当前用户的根目录。 其实这个页面显示的内容,是我们电脑目录C:\Users\当前用户\下的文件夹 我们平常做实验,希望在…

DDR简介

一、什么是DDR? DDR SDRAM(Double Data Rate Synchronous DYNAMIC RAM)中文名是:双倍数据速率同步动态随机存储器。 传统的SDRAM只在时钟信号的上升沿传输数据,而DDR可以同时在时钟的上升沿和下降沿传输数据&#xf…