import SparkMD5 from "spark-md5"
export async function splitFileToSmallChunks(file: File) {
const offset = 2 * 1024 * 1024
let chunks = [file.slice(0, offset)]
let cur = offset
while (cur < file.size) {
if (cur + offset >= file.size) {
chunks.push(file.slice(cur, cur + offset))
} else {
const mid = cur + offset / 2,
end = cur + offset
chunks.push(file.slice(cur, cur + 2))
chunks.push(file.slice(mid, mid + 2))
chunks.push(file.slice(end - 2, end))
}
cur += offset
}
return chunks
}
export async function getMd5(file: File, progressRef?: number) {
const chunks = await splitFileToSmallChunks(file)
const spark = new SparkMD5.ArrayBuffer()
for (let index = 0; index < chunks.length; index++) {
const reader = new FileReader()
reader.readAsArrayBuffer(chunks[index])
await new Promise((resolve) => {
reader.onload = async (e) => {
if (!e || !e.target) return console.log("发生异常")
spark.append(e.target.result as ArrayBuffer)
resolve(spark)
}
})
if (progressRef) {
progressRef += 100 / chunks.length
}
}
return spark.end()
}