@@ -94,10 +94,19 @@ const handleFileOnLoad = (
9494 let jsonFile : Record < string , unknown > | null = null ;
9595
9696 const bufferData : ArrayBuffer = e . target . result as ArrayBuffer ;
97- // 注意:第二个 'binary' 参数是无效的,这里要去掉
98- const uint8Array = new Uint8Array ( bufferData ) ;
9997 const regExp = / \. ( j s o n | r e p l a y | c a s t | p a r t ) ( \. m p 4 | \. j s o n | \. g z ) ? $ / ;
10098
99+ /**
100+ * MP4 类型:
101+ * 处理: 直接以 Blob → ObjectURL 作为 videoUrl
102+ * 补充: ArrayBuffer 是原始二进制内存, Uint8Array 是 读取/写入这块内存的视图
103+ *
104+ * gz tar 类型:
105+ * - .replay.gz 为 Gua 产生的录像,需要写入本地磁盘.同时也会存在 .replay.mp4 形式
106+ * - .cast.gz 为字符协议的录像,直接将 ArrayBuffer 转为 ObjectURL
107+ * - .part.gz 为 Gua 的分片录像,也需要直接写入磁盘
108+ */
109+
101110 /** -------------------- 处理 .tar -------------------- */
102111 if ( fileName . includes ( '.tar' ) ) {
103112 try {
@@ -108,6 +117,9 @@ const handleFileOnLoad = (
108117 const partJson : string = match ?. [ 0 ] ?? '' ;
109118 const decompressFileName : string = match ?. [ 1 ] ?? '' ;
110119
120+ // .part 是 rdp 的分片形式
121+ // .cast 是 字符协议的
122+
111123 // part 的 JSON:xxx.replay.json
112124 if ( partJson === '.replay.json' ) {
113125 jsonFile = safeParseJson ( extractedFile . buffer ) ?? jsonFile ;
@@ -178,7 +190,6 @@ const handleFileOnLoad = (
178190 break ;
179191 }
180192 default :
181- // 其他文件跳过
182193 break ;
183194 }
184195 }
@@ -209,8 +220,10 @@ const handleFileOnLoad = (
209220 switch ( processName ) {
210221 case 'replay' : {
211222 const isGua = fileName . split ( '.' ) [ 2 ] === 'gz' ;
223+
212224 if ( isGua ) {
213225 type = 'gua' ;
226+
214227 try {
215228 const res = await handleGuaData (
216229 e . currentTarget ?. result as ArrayBuffer ,
@@ -275,8 +288,14 @@ const handleFileOnLoad = (
275288 /** -------------------- 处理 .mp4 -------------------- */
276289 if ( fileName . includes ( '.mp4' ) ) {
277290 type = 'mp4' ;
291+
292+ /**
293+ * 完全没必要下面这种写法,可以直接替换为 const videoBlob = new Blob([e.currentTarget.result], { type: "video/mp4" });
294+ * new Blob 本身就可以接收 ArrayBuffer 类型 ArrayBufferView 类型 等,而 Uint8Array 类型本身就归属于 ArrayBufferView
295+ */
278296 const videoBuffer : Uint8Array = new Uint8Array ( e . currentTarget ?. result as ArrayBuffer ) ;
279297 const videoBlob : Blob = new Blob ( [ videoBuffer ] , { type : 'video/mp4' } ) ;
298+
280299 videoUrl = URL . createObjectURL ( videoBlob ) ;
281300
282301 fileStore . setVideoList ( {
@@ -312,13 +331,15 @@ const fileParser = (fileInfo: UploadFileInfo, eventOptions: IFileParser): Promis
312331
313332 fileReader . readAsArrayBuffer ( file ) ;
314333
334+ // 读取过程
315335 fileReader . onprogress = ( e : ProgressEvent < FileReader > ) => {
316336 if ( e . lengthComputable ) {
317337 const percentComplete = Math . round ( ( e . loaded / e . total ) * 100 ) ;
318338 eventOptions . onProgress ( { percent : percentComplete } ) ;
319339 }
320340 } ;
321341
342+ // 读取成功
322343 fileReader . onload = async ( e : ProgressEvent < FileReader > ) => {
323344 try {
324345 const res = await handleFileOnLoad ( e , fileName , eventOptions ) ;
@@ -332,6 +353,7 @@ const fileParser = (fileInfo: UploadFileInfo, eventOptions: IFileParser): Promis
332353 }
333354 } ;
334355
356+ // 读取失败
335357 fileReader . onerror = ( ) => {
336358 eventOptions . onError ( ) ;
337359 notification . error ( {
0 commit comments