文件上传的定义
服务端生成一个接口,用来接收前端传输的媒体数据,该过程称为文件上传.
文件上传的操作
流操作
计算机在进行数据写入时,会将数据转换成二进制数据流,之后将数据一点一点的写入/读取文件,该过程好像水流的过程,因此该过程称为流操作。
写入流
- 写入流主要用来向文件中写入数据
- 创建写入流
// 导入文件操作模块fs
var fs=require('fs');
var path=require('path');
// 创建文件写入流
var writeStream=fs.createWriteStream(path.join(__dirname,"user.txt"));
- 写入流写入数据
// 开始使用写入流,让数据写入文件
writeStream.write("1234567890");
- 写入流对应的事件
- finish事件
当写入流调用end结束标志时,该事件会被触发
//当数据写入完成时需要调用一个结束的标志
writeStream.end();//此时数据写入才算完成
//写入流对应的事件
writeStream.on("finish", function(){
// 该事件是在所有写入的数据全部被写入到底层系统时触发
console.log('数据写入完成');
});
- error事件
当写入流数据写入错误时调用
writeStream.on("error",function(err){
console.log('文件数据写入失败');
});
- data事件
当写入流捕获到需要写入的数据片段时调用,该事件一般用来接收前端传输的post数据
// 该事件会被重复调用,用来获取文件中不同的数据片段
writeStream.on("data", function(chunk){
//该事件代表有数据可读时触发,chunk对应的就是当前需要写入的数据片段
console.log('有数据需要写入'+chunk);
});
- 注意:node.js中response响应对象本身是一个写入流。目的是将服务器内部的数据写入到web端
读取流
主要完成文件中数据的读取过程
- 创建读取流
//读取流
var readStream = fs.createReadStream(path.join(__dirname, "user.txt"));
- 读取流的事件
data:当读取流读取到数据片段时执行该操作
var str = ""; //将每一次读取的数据片段拼接,最终存储完整数据
//读取里对应的事件
readStream.on("data", function(chunk){
//当存在可以被读取的数据时调用
console.log(chunk);
str += chunk;
});
- error:当读取流读取数据失败时调用
readStream.on('error', function(err){
console.log('数据读取失败'+err);
});
- end:当读取流读取数据结束时调用,该事件代表数据接收完毕
//数据读取完毕时
readStream.on('end', function(){
console.log('数据读取完毕')
console.log(str);
})
- 注意:在node服务端开发中request请求对象是一个读取流对象。request作用是将外界传递的数据读取到服务器内部。
管道流
在读取流和写入流之间连接一个管道,此时形成的结构被称为管道流
//管道流
var readStream = fs.createReadStream(path.join(__dirname, "user.txt"));
var writeStream = fs.createWriteStream(path.join(__dirname,
"infor.txt"));
//设置管道流
readStream.pipe(writeStream);
流在node服务端的作用
读取流
读取流(request对象):
可以用来获取前端通过POST传递的数据
//创建服务器
var seerver=http.createServer(function(req,res){
//跨域问题
res.setHeader("Access-Control-Allow-Origin","*");
//获取post请求的数据
if(req.method=="POST"){
//获取post传递的数据
var str="";
req.on('data',function(chunk){
str+=chunk;
});
req.on('end',function(){
console.log(str);
res.end('网络请求结束');
})
}
});
seerver.listen(8080);
管道流作用:
服务器将媒体数据通过响应对象输出给外部web,比如服务器实现图片远程访问
//创建服务器
var seerver = http.createServer(function (req, res) {
res.setHeader("Access-Control-Allow-Origin", "*");
if (req.method == "POST") {
// //获取post传递的数据
var str = "";
req.on('data', function (chunk) {
str += chunk;
});
req.on('end', function () {
console.log(str);
// res.end('网络请求结束');
})
}
var re = /img/g;
if (re.test(req.url)) {
// 获取文件名
var urls = req.url.split('/');
var fileName = urls.pop();//删除数组中的最后一个位置的元素并且将该元素返回
//创建读取流读取文件数据
var readStream = fs.createReadStream(path.join(__dirname, "static/" + fileName));
//将文件中的数据直接传输给外界展示图片
readStream.pipe(res);
}
// console.log(req.url);
});
web
<!-- GET请求,用来请求网址显示图片 -->
<img src="http://127.0.0.1:8080/img/2.jpeg" alt="">