技術回顧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
英文地址,請注明出處:http://en.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設計方式拖拽控件事件驅動代碼(簡單但局限)…