blob: ffaec1a128a25cefb4b7b37ebd452f9d47fb76bb (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
import SparkMD5 from "spark-md5"
const fileSlice = File.prototype.slice || File.prototype.mozSlice || File.prototype.webkitSlice
export class FileChecksum {
static create(file, callback) {
const instance = new FileChecksum(file)
instance.create(callback)
}
constructor(file) {
this.file = file
this.chunkSize = 2097152 // 2MB
this.chunkCount = Math.ceil(this.file.size / this.chunkSize)
this.chunkIndex = 0
}
create(callback) {
this.callback = callback
this.md5Buffer = new SparkMD5.ArrayBuffer
this.fileReader = new FileReader
this.fileReader.addEventListener("load", event => this.fileReaderDidLoad(event))
this.fileReader.addEventListener("error", event => this.fileReaderDidError(event))
this.readNextChunk()
}
fileReaderDidLoad(event) {
this.md5Buffer.append(event.target.result)
if (!this.readNextChunk()) {
const binaryDigest = this.md5Buffer.end(true)
const base64digest = btoa(binaryDigest)
this.callback(null, base64digest)
}
}
fileReaderDidError(event) {
this.callback(`Error reading ${this.file.name}`)
}
readNextChunk() {
if (this.chunkIndex < this.chunkCount) {
const start = this.chunkIndex * this.chunkSize
const end = Math.min(start + this.chunkSize, this.file.size)
const bytes = fileSlice.call(this.file, start, end)
this.fileReader.readAsArrayBuffer(bytes)
this.chunkIndex++
return true
} else {
return false
}
}
}
|