NodeJs form-data格式传输文件的方法


Posted in NodeJs onDecember 13, 2017

本文介绍了Node Js 使用KOA处理form-data格式传输过来的文件,分享给大家。具体如下:

使用koa有一段时间了,评价是小巧精悍,只封装了基本的如request对象和response对象到上下文中,其他功能基本上靠第三方中间件来实现。导致的问题是使用起来就不太方便了,比如用koa上传文件,网上资料有限,对于小白而言,文件上传操作就困难多了。

form表单上传文件流程(PHP和node js)

文件上传操作原理

form表单【注意:enctype=”multipart/form-data”】上传文件时,首先会将文件上传到你本机的temp目录,然后执行move_upload_file(tmpfile,newfile);然后node会不会是这样呢?答案是确定的,上传文件大家都是一样的思路。

//var tmpath = path.join(os.tmpdir(), '1.txt');//模拟上传到临时目录的文件 
  //console.log(tmpath); 
  //var ext = ".txt";//上传后生成文件的后缀,一般和上传的文件后缀一致 
  //var ph = path.join('public/upload', Date.parse(new Date()).toString() + ext);//生成新的上传文件路径全称 
  //console.log(ph); 
  //var stream = fs.createWriteStream(ph);//创建一个可写流 
  //fs.createReadStream(tmpath).pipe(stream);//可读流通过管道写入可写流

然后分析了下上面代码:

fs.createWriteStream(path.join(os.tmpdir(), Math.random().toString()));

这里创建一个可写的流对象,即创建一个表单上传后移动到新目录的空文件;而os.tmpDir()刚好是本机临时目录,上面代码表示在临时目录下生成一个随机数空文件;

part.pipe(stream);

上面的代码表示将可读流对象内容写入到可写的流对象,即上面生成的临时文件下的文件;part是将request里面的文件对象解析成可读流。

然后koa文件上传原理就清楚了。通过表单上传文件,文件默认会存放到本机临时目录下生成一个临时文件。然后通过流的形式,打开这个临时文件将数据写入到一个新地址的可写文件流里面,前提是要提前创建这个空的可写流文件,即我们上传目标文件。

KOA2解析传输过来的post form-data信息

const Koa = require('koa');
const app = new Koa();
const bodyParser = require('koa-bodyparser');
const koaBody = require('koa-body');
const router = require('./router');
// 输出请求路径,每次请求都会输出
app.use(async (ctx, next) => {
console.log(`Process ${ctx.request.method} ${ctx.request.url}...`);
await next();
});
// 文件上传,注意书写的位置很重要,否则无法上传
app.use(koaBody({ multipart: true }));
// 解析请求体
app.use(bodyParser());
// 使用路由
app.use(router());
app.listen(3000);
console.log('app started at port 3000...');

总结一下的话,就是前端用form传递文件,bodyParse解析出这个form,对应的字段是ctx.request.body.files.字段名称(eg: abc),最后通过拷贝临时的数据文件来达到上传存储的目的。

bodyParse解析出的格式:

{ fields: { aaa: '123345' },    //Text类型的解析到fields中
 files:              //File类型的解析到files中
  { 
   abc: 
   File {
    domain: null,
    _events: {},
    _eventsCount: 0,
    _maxListeners: undefined,
    size: 12525,
    path: 'C:\\Users\\DANNYJ~1\\AppData\\Local\\Temp\\upload_d896dcc755fcd36156c6814aafb7685e',
    name: 'bamboo5.png',
    type: 'image/png',
    hash: null,
    lastModifiedDate: 2017-12-08T10:17:04.355Z,
    _writeStream: [Object] } 
   } 
}

KOA2将POST传过来的文件存储到本地

var file = ctx.request.body.files.abc  //传输文件的name是abc
  console.log(ctx.request.body)
  var tmpath= file['path'];
  var tmparr =file['name'].split('.');
  var ext ='.'+tmparr[tmparr.length-1];
  var newpath =path.join('./', parseInt(Math.random()*100) + Date.parse(new Date()).toString() + ext);
  console.log(tmpath);
  console.log(newpath);
  var stream = fs.createWriteStream(newpath);//创建一个可写流
  fs.createReadStream(tmpath).pipe(stream);//可读流通过管道写入可写流

然后就会发现项目当前目录下面就会多出上传的文件了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
Nodejs异步回调的优雅处理方法
Sep 25 NodeJs
基于NodeJS的前后端分离的思考与实践(三)轻量级的接口配置建模框架
Sep 26 NodeJs
Nodejs极简入门教程(三):进程
Oct 27 NodeJs
轻松创建nodejs服务器(4):路由
Dec 18 NodeJs
快速掌握Node.js之Window下配置NodeJs环境
Mar 21 NodeJs
nodejs结合socket.io实现websocket通信功能的方法
Jan 12 NodeJs
nodejs用gulp管理前端文件方法
Jun 24 NodeJs
NodeJS服务器实现gzip压缩的示例代码
Oct 12 NodeJs
nodejs微信开发之接入指南
Mar 17 NodeJs
Nodejs中的require函数的具体使用方法
Apr 02 NodeJs
NodeJs实现简易WEB上传下载服务器
Aug 10 NodeJs
使用 Koa + TS + ESLlint 搭建node服务器的过程详解
May 30 NodeJs
nodejs实现截取上传视频中一帧作为预览图片
Dec 10 #NodeJs
nodejs实现大文件(在线视频)的读取
Oct 16 #NodeJs
nodejs发送http请求时遇到404长时间未响应的解决方法
Dec 10 #NodeJs
NodeJs实现定时任务的示例代码
Dec 05 #NodeJs
windows系统下更新nodejs版本的方案
Nov 24 #NodeJs
nodejs项目windows下开机自启动的方法
Nov 22 #NodeJs
使用nodeJs来安装less及编译less文件为css文件的方法
Nov 20 #NodeJs
You might like
php通用防注入程序 推荐
2011/02/26 PHP
PHP实现获取FLV文件的时间
2015/02/10 PHP
ThinkPHP中Common/common.php文件常用函数功能分析
2016/05/20 PHP
php实现的SSO单点登录系统接入功能示例分析
2016/10/12 PHP
PHP自定义序列化接口Serializable用法分析
2017/12/29 PHP
javascript中clone对象详解
2014/12/03 Javascript
Nodejs实现的一个静态服务器实例
2014/12/06 NodeJs
node.js中的http.request方法使用说明
2014/12/14 Javascript
js实现拖拽效果
2015/02/12 Javascript
JQuery鼠标移到小图显示大图效果的方法
2015/06/10 Javascript
javascript背景时钟实现方法
2015/06/18 Javascript
使用js复制链接中的部分文字的方法
2015/07/30 Javascript
SpringMVC restful 注解之@RequestBody进行json与object转换
2015/12/10 Javascript
使用js获取伪元素的content实例
2017/10/24 Javascript
Mint UI组件库CheckList使用及踩坑总结
2018/12/20 Javascript
[52:15]2014 DOTA2国际邀请赛中国区预选赛5.21 HGT VS LGD-GAMING
2014/05/23 DOTA
Python基础教程之内置函数locals()和globals()用法分析
2018/03/16 Python
Python编程中NotImplementedError的使用方法
2018/04/21 Python
python实现文件助手中查看微信撤回消息
2019/04/29 Python
python3 图片 4通道转成3通道 1通道转成3通道 图片压缩实例
2019/12/03 Python
python3 requests库实现多图片爬取教程
2019/12/18 Python
Python基于内置库pytesseract实现图片验证码识别功能
2020/02/24 Python
澳大利亚玩具剧场:Toy Playhouse
2019/03/03 全球购物
营销总经理的岗位职责
2013/12/15 职场文书
小学防溺水制度
2014/01/29 职场文书
机关会计岗位职责
2014/04/08 职场文书
雷人标语集锦
2014/06/19 职场文书
师德师风自我评价范文
2014/09/11 职场文书
市场调研项目授权委托书范本
2014/10/04 职场文书
董事长助理岗位职责
2015/02/11 职场文书
上下班时间调整通知
2015/04/23 职场文书
2015年新教师个人工作总结
2015/10/14 职场文书
2019个人年度目标制定攻略!
2019/07/12 职场文书
Nginx反向代理及负载均衡如何实现(基于linux)
2021/03/31 Servers
python pygame入门教程
2021/06/01 Python
Win11怎么解除儿童账号限制?Win11解除微软儿童账号限制方法
2022/07/07 数码科技