nodejs可以直接根据文件路径读取文件,不需要从input标签获取,但是读文件的时候发现格式转来转去好麻烦,先记录一个
// 获得文件md5
getFileMD5(localFilePath, callback) {
var stateInfo = fs.statSync(localFilePath)
var fileSize = stateInfo.size
//文件每块分割10M,计算分割详情
// chunkSize = 2097152,
var chunkSize = 1024*1024*10
var chunks = Math.ceil(fileSize / chunkSize)
var currentChunk = 0
//创建md5对象(基于SparkMD5)
var spark = new SparkMD5.ArrayBuffer()
var fd = fs.openSync(localFilePath, 'r')
var buf = Buffer.alloc(chunkSize)
//处理单片文件的数据
function loadNext() {
var start = currentChunk * chunkSize
var len = start + chunkSize >= fileSize ? (fileSize - start) : chunkSize
fs.read(fd, buf, 0, len, start, (err, bytesRead, buffer)=>{
var arrayBuf = Uint8Array.from(buffer.slice(0, bytesRead)).buffer
//console.log(arrayBuf)
spark.append(arrayBuf)
++currentChunk
if(start + bytesRead < fileSize){
// 循环读取
loadNext()
}else{
fs.closeSync(fd)
callback(spark.end())
}
})
}
//触发读取文件
loadNext()
}
nodejs里readfile需要传入文件路径,回调里是所有数据,如果读取大文件,这种方式不可取,read可以根据偏移读取文件的指定长度的内容
但是回调中的数据格式是Buffer, spark-md5可以appendBianry,也可以append接入ArrayBuffer,而nodejs中明确了Buffer可以和ArrayBuffer相互转换,于是就想到了用ArrayBuffer格式的数据计算md5,1G以上文件亲测有效,但是速度就有点慢,经过测试,发现瓶颈是在读文件,读文件的速度比c语言操作文件的读文件慢得多,于是可以用stream的方式来读取文件
// 获得文件md5
getFileMD5(localFilePath, callback) {
var stateInfo = fs.statSync(localFilePath)
var fileSize = stateInfo.size
//文件每块分割10M,计算分割详情
var chunkSize = 1024*1024*10
var chunks = Math.ceil(fileSize / chunkSize)
var currentChunk = 0
//创建md5对象(基于SparkMD5)
var spark = new SparkMD5.ArrayBuffer()
let rs = fs.createReadStream(localFilePath,{
autoClose: true
})
rs.on('data', (chunk)=>{
// chunk是Buffer
spark.append(chunk)
})
rs.on('end', ()=>{
if(callback){
callback(spark.end())
}
})