nodejs根据文件路径获取大文件的md5

1 篇文章 0 订阅

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())
			}
		})

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值