如何手写一款KOA的中间件来实现断点续传 (4)

上传的内容大概长这样,空行的代码是\r\n,转化成二进制就是占2个位置,所以两个空行的截取就可以获取到字段信息和内容。因为末尾也有一个空行,所以在截取二进制文件内容的时候,除了头部的长度+2换行的长度,末尾的1换行长度也要加上,所以是line.slice(head.length + 4, -2)这个样子的。

function copeData(buffer,boundary){ let lines = splitBuffer(buffer,boundary); lines=lines.slice(1,-1);//去除首尾 let obj={}; lines.forEach(line=>{ let [head,tail] = splitBuffer(line,"\r\n\r\n"); head = head.toString(); if(head.includes('filename')){ // 这是文件 obj["file"]= line.slice(head.length + 4, -2) }else{ // 文本 let name = head.match(/name="(\w*)"/)[1]; let value= tail.toString().slice(0,-2); obj[name]=value } }); } 重命名文件

我们上传的文件一般不存在原名保存,万一大家喜欢传重名的文件呢?头疼啊!这个时候就需要重命名,我一般喜欢用md5来计算新的文件名。这里可以拼接我们上传的一些字段
比如时间,主要是给一个特殊的标识,以保证当前上传的文件区别去其他文件。毕竟相同的内容用md5计算都是一样的,相同的文件名md5计算后并没有起到区分的作用。

当然文件的后缀不能忘记!不然文件保存下来了也打不开。所以记得提取一下文件后缀。

let fileOriName=crypto.createHash("md5").update(obj.fileOriName).digest("hex") let fileSuffix=obj.fileOriName.substring(obj.fileOriName.lastIndexOf(".")+1) 保存文件

此处我是按照是否是第一切片为主,看看是新建覆盖还是重新追加文件内容。大家注意下,因为如果文件不存在直接appendFileSync是会报错的。但是重复writeFileSync又会覆盖内容。所以需要区分一下,大家可以通过判断文件是否存在来进行区分~。

if(parseInt(obj.start)===0){ fs.writeFileSync(__dirname+`/uploads/${fileOriName}.${fileSuffix}`,obj.file); }else{ fs.appendFileSync(__dirname+`/uploads/${fileOriName}.${fileSuffix}`,obj.file); } repeat repeat repeat

重复重复~直至客户端的切片全部传送完毕~

附录:

不理解KOA的可以看看我其他的文章:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpdsyz.html