Created
July 18, 2016 10:13
-
-
Save jossef/13560bc24fb8da3231271dd8f4375bab to your computer and use it in GitHub Desktop.
calculate md5 hash in browser of large file
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function calculateMD5Hash(file, bufferSize) { | |
var def = Q.defer(); | |
var fileReader = new FileReader(); | |
var fileSlicer = File.prototype.slice || File.prototype.mozSlice || File.prototype.webkitSlice; | |
var hashAlgorithm = new SparkMD5(); | |
var totalParts = Math.ceil(file.size / bufferSize); | |
var currentPart = 0; | |
var startTime = new Date().getTime(); | |
fileReader.onload = function(e) { | |
currentPart += 1; | |
def.notify({ | |
currentPart: currentPart, | |
totalParts: totalParts | |
}); | |
var buffer = e.target.result; | |
hashAlgorithm.appendBinary(buffer); | |
if (currentPart < totalParts) { | |
processNextPart(); | |
return; | |
} | |
def.resolve({ | |
hashResult: hashAlgorithm.end(), | |
duration: new Date().getTime() - startTime | |
}); | |
}; | |
fileReader.onerror = function(e) { | |
def.reject(e); | |
}; | |
function processNextPart() { | |
var start = currentPart * bufferSize; | |
var end = Math.min(start + bufferSize, file.size); | |
fileReader.readAsBinaryString(fileSlicer.call(file, start, end)); | |
} | |
processNextPart(); | |
return def.promise; | |
} | |
function calculate() { | |
var input = document.getElementById('file'); | |
if (!input.files.length) { | |
return; | |
} | |
var file = input.files[0]; | |
var bufferSize = Math.pow(1024, 2) * 10; // 10MB | |
calculateMD5Hash(file, bufferSize).then( | |
function(result) { | |
// Success | |
console.log(result); | |
}, | |
function(err) { | |
// There was an error, | |
}, | |
function(progress) { | |
// We get notified of the progress as it is executed | |
console.log(progress.currentPart, 'of', progress.totalParts, 'Total bytes:', progress.currentPart * bufferSize, 'of', progress.totalParts * bufferSize); | |
}); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<script src="https://cdnjs.cloudflare.com/ajax/libs/q.js/1.4.1/q.js"></script> | |
<script src="https://cdnjs.cloudflare.com/ajax/libs/spark-md5/2.0.2/spark-md5.min.js"></script> | |
<div> | |
<input type="file" id="file"/> | |
<input type="button" onclick="calculate();" value="Calculate" class="btn primary" /> | |
</div> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment