目录
介绍
JavaScript语言自身只有字符串数据类型,没有二进制数据类型。但在处理文件流时,必须使用到二进制数据。因此在Node.js中,定义了一个buffer类,该类用来创建一个专门存放二进制数据的缓存区
创建buffer类
var var str = "好好学习";
var var buff1 = new Buffer(str); // ⽅法1
var var buff2 = Buffer.from(str); // ⽅法2
console.log( str, str.length );
console.log( buff1, buff1.length );
console.log( buff2, buff2.length );
console.log( JSON.stringify(buff2) );
console.log( buff2.toString() ) //可把普通的数据转换为字符串
在v6.0之前创建Buffer对象直接使⽤new Buffer()构造函数来创建对象实例,但是Buffer对内存的权限操作相⽐很⼤,可以直接捕获⼀些敏感信息,所以在 v6.0以后,官⽅⽂档⾥⾯建议使⽤ Buffer.from() 接⼝去创建Buffer对象。
buffer合并与剪切
var buff1 = new buffer("我爱")
var buff2 = new buffer("学习")
//合并 concat方法不会对buff1和buff2造成修改
var buff3 = Buffer.concat([buff1,buff2])
var buff4 = buff1.slice(0,1)
console.log(buff3,buff4.toString())
//"爱学习" "我"
buffer截取具体内容
拿到数据之后通常要对数据进行分解,通常会有两个关键内容,一个是文件名称,一个是具体内容
1. ⽂件名称:第2⾏,filename的值。
2. 具体内容:第5⾏、第6⾏、第7⾏。
下面的完整的代码演示:(对文字和图片都有非常好的转码适配效果)
var http = require('http')
var fs = require('fs')
http.createServer((request,respose)=>{
respose.writeHead(200,{
"Content-Type":"text/html;charset=utf-8"
})
switch(request.url){
case "/template":
respose.write(fs.readFileSync("./template.html"))
break;
case "/chk":
respose.write('上传')
var chunks = [] //用于存储二进制数据
request.on('data',chunk=>{
chunks.push(chunk) //每当监听到数据时,都会往盒子里面追加数据
})
request.on('end',()=>{
var h = Buffer.concat(chunks) //当数据追加完之后进行合并
var arr = [] //收集上传的文件内容中,所有换行符号的下标
for(var i=0;i<h.length;i++){
if( h[i]==13 && h[i+1]==10 ){ //一次空格会有两个字符分别是13和10
arr.push(i) //将空格收集起来
}
}
// console.log(arr); //[ 40, 104, 144, 146, 163, 207 ]
//获取文件名称
var filename = h.slice(arr[0]+2,arr[1]).toString().split('filename=')[1].replace(/\"/g,"")
//获取文件内容
var data = h.slice(arr[3]+2,arr[arr.length-2])
fs.writeFileSync(filename,data,function(err){
console.log(err);
})
})
break;
}
respose.end(); //返回值,必须要返回值
}).listen(8082)