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如何搭建Web服务器
Mar 28 NodeJs
nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证示例
Dec 30 NodeJs
详解nodejs微信公众号开发——5.素材管理接口
Apr 11 NodeJs
详解Nodejs之npm&package.json
Jun 15 NodeJs
NodeJS 实现手机短信验证模块阿里大于功能
Jun 19 NodeJs
Nodejs 复制文件/文件夹的方法
Aug 24 NodeJs
nodejs连接mysql数据库及基本知识点详解
Mar 20 NodeJs
NodeJS安装图文教程
Apr 19 NodeJs
NodeJS实现自定义流的方法
Aug 01 NodeJs
详解Nodejs get获取远程服务器接口数据
Mar 26 NodeJs
nodejs二进制与Buffer的介绍与使用
Jul 11 NodeJs
NodeJs crypto加密制作token的实现代码
Nov 15 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中获取内网用户MAC地址(WINDOWS/linux)的实现代码
2011/08/11 PHP
php shell超强免杀、减少体积工具实现代码
2012/10/16 PHP
简单实用的网站PHP缓存类实例
2014/07/18 PHP
PHP中的命名空间详细介绍
2015/07/02 PHP
Discuz!X中SESSION机制实例详解
2015/09/23 PHP
php文件包含的几种方式总结
2019/09/19 PHP
漂亮的提示信息(带箭头)
2007/03/21 Javascript
js中有关IE版本检测
2012/01/04 Javascript
JQuery Highcharts 动态生成图表的方法
2013/11/15 Javascript
使用typeof判断function是否存在于上下文
2014/08/14 Javascript
javascript从作用域链谈闭包
2020/07/29 Javascript
jQuery焦点图左右转换效果
2016/12/12 Javascript
几种tab切换详解
2017/02/03 Javascript
解决vue router使用 history 模式刷新后404问题
2017/07/19 Javascript
jQuery EasyUI Layout实现tabs标签的实例
2017/09/26 jQuery
webpack打包nodejs项目的方法
2018/09/26 NodeJs
轻量级富文本编辑器wangEditor结合vue使用方法示例
2018/10/10 Javascript
每天学点Vue源码之vm.$mount挂载函数
2019/03/11 Javascript
Vue-CLI项目中路由传参的方式详解
2019/09/01 Javascript
JavaScript的console命令使用实例
2019/12/03 Javascript
解决Can't find variable: SockJS vue项目的问题
2020/09/22 Javascript
antd-日历组件,前后禁止选择,只能选中间一部分的实例
2020/10/29 Javascript
django批量导入xml数据
2016/10/16 Python
Python PyInstaller库基本使用方法分析
2019/12/12 Python
python实现QQ邮箱发送邮件
2020/03/06 Python
django model的update时auto_now不被更新的原因及解决方式
2020/04/01 Python
使用Python构造hive insert语句说明
2020/06/06 Python
英国床和浴室商场:Bed & Bath Emporium
2018/05/20 全球购物
瀑布模型都有哪些优缺点
2014/06/23 面试题
置业顾问岗位职责
2014/03/02 职场文书
家长对老师的评语
2014/04/18 职场文书
县委务虚会发言材料
2014/10/20 职场文书
爱国教育主题班会
2015/08/14 职场文书
2019最新公司租房合同(例文)
2019/07/18 职场文书
Python获取指定日期是"星期几"的6种方法
2022/03/13 Python
tomcat正常启动但网页却无法访问的几种解决方法
2022/05/06 Servers