whale-plus
Version:
A Component Library for Vue 3
1 lines • 5.15 kB
Source Map (JSON)
{"version":3,"file":"FileChunk.mjs","sources":["../../../../../../../packages/upload-sdk/src/upload-client/split/FileChunk.ts"],"sourcesContent":["import SparkMD5 from 'spark-md5';\n\nexport interface Chunk {\n blob: Blob; // 分片的二进制数据\n sparkResult: any;\n start: number; // 分片的起始位置\n end: number; // 分片的结束位置\n hash: string; // 分片的hash值\n index: number; // 分片在文件中的索引\n}\n\n/**\n * 创建文件块\n *\n * 该函数的目的是将一个大文件分割成多个小块,以便于分块处理,如分块上传到服务器\n * 每个文件块包含文件的一部分,以及一些元数据,如文件块的起始位置、结束位置、哈希值和索引\n *\n * @param file 要分割的文件对象\n * @param index 当前文件块的索引,用于确定文件块在原始文件中的位置\n * @param chunkSize 文件块的大小,以字节为单位\n * @returns 返回一个包含文件块信息的对象,包括文件块的Blob对象、起始位置、结束位置、哈希值和索引\n */\nexport function createChunk(\n file: File,\n index: number,\n chunkSize: number\n): Chunk {\n // 计算文件块的起始位置\n const start = index * chunkSize;\n // 计算文件块的结束位置,确保不超过文件的总大小\n const end = Math.min(start + chunkSize, file.size);\n // 使用File对象的slice方法截取文件的一部分,生成Blob对象\n const blob = file.slice(start, end);\n\n // 返回包含文件块信息的对象\n return {\n blob,\n start,\n end,\n hash: '',\n index,\n } as Chunk;\n}\n\n/**\n * 计算文件块的MD5哈希值\n * 此函数用于生成一个文件块的MD5哈希值,它通过使用SparkMD5库和FileReader API来实现\n * 选择使用Promise来处理异步文件读取操作,确保在文件读取完成后才计算哈希值\n *\n * @param chunk 文件块对象,包含需要计算哈希值的文件信息\n * @returns 返回一个Promise,解析为文件块的MD5哈希值字符串\n */\nexport function calcChunkHash(chunk: Chunk): Promise<string> {\n return new Promise((resolve) => {\n // 初始化SparkMD5实例,用于计算ArrayBuffer类型的MD5哈希值\n const spark = new SparkMD5.ArrayBuffer();\n // 创建FileReader实例,用于读取文件内容\n const fileReader = new FileReader();\n // 当文件读取完成时,处理读取结果\n fileReader.onload = (e) => {\n // 将读取到的文件内容追加到SparkMD5实例中\n spark.append(e.target?.result as ArrayBuffer);\n // 计算最终的MD5哈希值,并通过Promise解析\n resolve(spark.end());\n };\n // 将文件块作为ArrayBuffer类型读取\n fileReader.readAsArrayBuffer(chunk.blob);\n });\n}\n\nexport function calcChunkHashAndSparkResult(chunk: Chunk) {\n return new Promise((resolve) => {\n // 初始化SparkMD5实例,用于计算ArrayBuffer类型的MD5哈希值\n const spark = new SparkMD5.ArrayBuffer();\n // 创建FileReader实例,用于读取文件内容\n const fileReader = new FileReader();\n // 当文件读取完成时,处理读取结果\n fileReader.onload = (e) => {\n // 将读取到的文件内容追加到SparkMD5实例中\n spark.append(e.target?.result as ArrayBuffer);\n // 计算最终的MD5哈希值,并通过Promise解析\n resolve({\n sparkResult: e.target?.result,\n hash: spark.end(),\n });\n };\n // 将文件块作为ArrayBuffer类型读取\n fileReader.readAsArrayBuffer(chunk.blob);\n });\n}\n"],"names":[],"mappings":";;AAsBgB,SAAA,WAAA,CACd,IACA,EAAA,KAAA,EACA,SACO,EAAA;AAEP,EAAA,MAAM,QAAQ,KAAQ,GAAA,SAAA,CAAA;AAEtB,EAAA,MAAM,MAAM,IAAK,CAAA,GAAA,CAAI,KAAQ,GAAA,SAAA,EAAW,KAAK,IAAI,CAAA,CAAA;AAEjD,EAAA,MAAM,IAAO,GAAA,IAAA,CAAK,KAAM,CAAA,KAAA,EAAO,GAAG,CAAA,CAAA;AAGlC,EAAO,OAAA;AAAA,IACL,IAAA;AAAA,IACA,KAAA;AAAA,IACA,GAAA;AAAA,IACA,IAAM,EAAA,EAAA;AAAA,IACN,KAAA;AAAA,GACF,CAAA;AACF,CAAA;AAUO,SAAS,cAAc,KAA+B,EAAA;AAC3D,EAAO,OAAA,IAAI,OAAQ,CAAA,CAAC,OAAY,KAAA;AAE9B,IAAM,MAAA,KAAA,GAAQ,IAAI,QAAA,CAAS,WAAY,EAAA,CAAA;AAEvC,IAAM,MAAA,UAAA,GAAa,IAAI,UAAW,EAAA,CAAA;AAElC,IAAW,UAAA,CAAA,MAAA,GAAS,CAAC,CAAM,KAAA;AA3D/B,MAAA,IAAA,EAAA,CAAA;AA6DM,MAAA,KAAA,CAAM,MAAO,CAAA,CAAA,EAAA,GAAA,CAAA,CAAE,MAAF,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAU,MAAqB,CAAA,CAAA;AAE5C,MAAQ,OAAA,CAAA,KAAA,CAAM,KAAK,CAAA,CAAA;AAAA,KACrB,CAAA;AAEA,IAAW,UAAA,CAAA,iBAAA,CAAkB,MAAM,IAAI,CAAA,CAAA;AAAA,GACxC,CAAA,CAAA;AACH,CAAA;AAEO,SAAS,4BAA4B,KAAc,EAAA;AACxD,EAAO,OAAA,IAAI,OAAQ,CAAA,CAAC,OAAY,KAAA;AAE9B,IAAM,MAAA,KAAA,GAAQ,IAAI,QAAA,CAAS,WAAY,EAAA,CAAA;AAEvC,IAAM,MAAA,UAAA,GAAa,IAAI,UAAW,EAAA,CAAA;AAElC,IAAW,UAAA,CAAA,MAAA,GAAS,CAAC,CAAM,KAAA;AA7E/B,MAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AA+EM,MAAA,KAAA,CAAM,MAAO,CAAA,CAAA,EAAA,GAAA,CAAA,CAAE,MAAF,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAU,MAAqB,CAAA,CAAA;AAE5C,MAAQ,OAAA,CAAA;AAAA,QACN,WAAA,EAAA,CAAa,EAAE,GAAA,CAAA,CAAA,MAAA,KAAF,IAAU,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,MAAA;AAAA,QACvB,IAAA,EAAM,MAAM,GAAI,EAAA;AAAA,OACjB,CAAA,CAAA;AAAA,KACH,CAAA;AAEA,IAAW,UAAA,CAAA,iBAAA,CAAkB,MAAM,IAAI,CAAA,CAAA;AAAA,GACxC,CAAA,CAAA;AACH;;;;"}