| 1 | import SparkMD5 from "spark-md5"; |
| 2 | |
| 3 | export default function fileSum(file: File) { |
| 4 | const spark = new SparkMD5.ArrayBuffer(); |
| 5 | const fileReader = new FileReader(); |
| 6 | |
| 7 | if (file.size === 0) { |
| 8 | return Promise.reject(new Error("File is empty!")); |
| 9 | } |
| 10 | |
| 11 | return new Promise<string>((resolve, reject) => { |
| 12 | fileReader.onload = (e: Event) => { |
| 13 | try { |
| 14 | const target = e.target as FileReader; |
| 15 | if (!target.result) { |
| 16 | return reject(new Error("FileReader result is null or undefined")); |
| 17 | } |
| 18 | const buf = target.result as ArrayBuffer; |
| 19 | if (!buf || buf.byteLength === 0) { |
| 20 | return reject(new Error("File is empty or could not be read")); |
| 21 | } |
| 22 | const chunkHead = buf.slice(0, 512); |
| 23 | const chunkTail = buf.slice(-512); |
| 24 | spark.append(chunkHead); |
| 25 | spark.append(chunkTail); |
| 26 | resolve(spark.end()); |
| 27 | } catch (err) { |
| 28 | return reject(new Error(`FileReader onload error: ${err}`)); |
| 29 | } |
| 30 | }; |
| 31 | |
| 32 | fileReader.onerror = (event: Event) => { |
| 33 | const target = event.target as FileReader; |
| 34 | const error = target.error; |
| 35 | if (error) { |
| 36 | reject(new Error(`FileReader error: ${error.name} - ${error.message}`)); |
| 37 | } else { |
| 38 | reject(new Error("FileReader encountered an unknown error")); |
| 39 | } |
| 40 | }; |
| 41 | |
| 42 | fileReader.onabort = () => { |
| 43 | reject(new Error("File reading was aborted")); |
| 44 | }; |
| 45 | |
| 46 | fileReader.readAsArrayBuffer(file); |
| 47 | }); |
| 48 | } |