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为什么选择javascript为载体语言
Jan 13 NodeJs
nodejs URL模块操作URL相关方法介绍
Mar 03 NodeJs
NodeJS连接MongoDB数据库时报错的快速解决方法
May 13 NodeJs
Nodejs中 npm常用命令详解
Jul 04 NodeJs
NodeJs测试框架Mocha的安装与使用
Mar 28 NodeJs
详解Windows下安装Nodejs步骤
May 18 NodeJs
nodejs接入阿里大鱼短信验证码的方法
Jul 10 NodeJs
nodeJs爬虫的技术点总结
May 13 NodeJs
nodejs(officegen)+vue(axios)在客户端导出word文档的方法
Jul 31 NodeJs
Nodejs模块的调用操作实例分析
Dec 25 NodeJs
NodeJS实现同步的方法
Mar 02 NodeJs
Nodejs中使用puppeteer控制浏览器中视频播放功能
Aug 26 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
关于IIS php调用com组件的权限问题
2012/01/11 PHP
PHP 第二节 数据类型之数组
2012/04/28 PHP
php cc攻击代码与防范方法
2012/10/18 PHP
PHP版 汉字转码的实现详解
2013/06/09 PHP
laravel dingo API返回自定义错误信息的实例
2019/09/29 PHP
利用JS解决ie6不支持max-width,max-height问题的方法
2014/01/02 Javascript
jQuery遍历页面所有CheckBox查看是否被选中的方法
2015/04/14 Javascript
下雪了 javascript实现雪花飞舞
2020/08/02 Javascript
设计模式中的组合模式在JavaScript程序构建中的使用
2016/05/18 Javascript
JS跨域请求外部服务器的资源
2017/02/06 Javascript
Vue ElementUI之Form表单验证遇到的问题
2017/08/21 Javascript
详解微信小程序中的页面代码中的模板的封装
2017/10/12 Javascript
JS从非数组对象转数组的方法小结
2018/03/26 Javascript
js的各种数据类型判断的介绍
2019/01/19 Javascript
微信小程序地图实现展示线路
2020/07/29 Javascript
利用node.js开发cli的完整步骤
2020/12/29 Javascript
python 中文乱码问题深入分析
2011/03/13 Python
为Python的web框架编写前端模版的教程
2015/04/30 Python
python中如何使用正则表达式的集合字符示例
2017/10/09 Python
Python3中类、模块、错误与异常、文件的简易教程
2017/11/20 Python
Python实现螺旋矩阵的填充算法示例
2017/12/28 Python
Python列表切片操作实例总结
2019/02/19 Python
详解python3安装pillow后报错没有pillow模块以及没有PIL模块问题解决
2019/04/17 Python
pyqt5中动画的使用详解
2020/04/01 Python
解决Python3.8运行tornado项目报NotImplementedError错误
2020/09/02 Python
阿迪达斯奥地利官方商城:adidas.at
2016/10/16 全球购物
雷蛇美国官网:Razer
2020/04/03 全球购物
医学院护理专业应届生求职信
2013/11/12 职场文书
小学生打架检讨书
2014/01/26 职场文书
四年大学生活的自我评价范文
2014/02/07 职场文书
高三学生评语大全
2014/04/25 职场文书
质量安全标语
2014/06/07 职场文书
教师政风行风自查自纠报告
2014/10/21 职场文书
五好家庭事迹材料
2014/12/20 职场文书
春节慰问简报
2015/07/21 职场文书
成人成长感言如何写?
2019/08/16 职场文书