node.js-文件上传

文件上传的定义

服务端生成一个接口,用来接收前端传输的媒体数据,该过程称为文件上传.

文件上传的操作

流操作

计算机在进行数据写入时,会将数据转换成二进制数据流,之后将数据一点一点的写入/读取文件,该过程好像水流的过程,因此该过程称为流操作。

写入流
  • 写入流主要用来向文件中写入数据
  • 创建写入流
// 导入文件操作模块fs
var fs=require('fs');
var path=require('path');

// 创建文件写入流
var writeStream=fs.createWriteStream(path.join(__dirname,"user.txt"));
  • 写入流写入数据
// 开始使用写入流,让数据写入文件
writeStream.write("1234567890");

  • 写入流对应的事件
  1. finish事件
    当写入流调用end结束标志时,该事件会被触发
//当数据写入完成时需要调用一个结束的标志
writeStream.end();//此时数据写入才算完成
//写入流对应的事件
writeStream.on("finish", function(){
// 该事件是在所有写入的数据全部被写入到底层系统时触发
console.log('数据写入完成');
});
  1. error事件
    当写入流数据写入错误时调用
writeStream.on("error",function(err){
  console.log('文件数据写入失败');
});
  1. data事件
    当写入流捕获到需要写入的数据片段时调用,该事件一般用来接收前端传输的post数据
// 该事件会被重复调用,用来获取文件中不同的数据片段
writeStream.on("data", function(chunk){
//该事件代表有数据可读时触发,chunk对应的就是当前需要写入的数据片段
console.log('有数据需要写入'+chunk);
});
  1. 注意: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="">

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值