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如何获取时间戳与时间差
Aug 03 NodeJs
用NodeJS实现批量查询地理位置的经纬度接口
Aug 16 NodeJs
nodejs创建简易web服务器与文件读写的实例
Sep 07 NodeJs
浅谈NodeJs之数据库异常处理
Oct 25 NodeJs
原生nodejs使用websocket代码分享
Apr 07 NodeJs
NodeJs 文件系统操作模块fs使用方法详解
Nov 26 NodeJs
nodejs微信开发之授权登录+获取用户信息
Mar 17 NodeJs
NodeJs之word文件生成与解析的实现代码
Apr 01 NodeJs
NodeJs crypto加密制作token的实现代码
Nov 15 NodeJs
nodejs nedb 封装库与使用方法示例
Feb 06 NodeJs
NodeJS模块Buffer原理及使用方法解析
Nov 11 NodeJs
NodeJS和浏览器中this关键字的不同之处
Mar 03 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 文章采集正则代码
2009/12/28 PHP
PHP实现根据浏览器跳转不同语言页面代码
2013/08/02 PHP
PHP采用get获取url汉字出现乱码的解决方法
2014/11/13 PHP
基于递归实现的php树形菜单代码
2014/11/19 PHP
php生成唯一的订单函数分享
2015/02/02 PHP
PHP批量生成图片缩略图的方法
2015/06/18 PHP
php注册登录系统简化版
2020/12/28 PHP
php基于dom实现读取图书xml格式数据的方法
2017/02/03 PHP
PHP数据库操作二:memcache用法分析
2017/08/16 PHP
多次注册事件会导致一个事件被触发多次的解决方法
2013/08/12 Javascript
禁止ajax缓存获取程序最新数据的方法
2013/11/19 Javascript
jquery插件tooltipv顶部淡入淡出效果使用示例
2013/12/05 Javascript
理解javascript中的with关键字
2016/02/15 Javascript
深入理解jquery自定义动画animate()
2016/05/24 Javascript
javascript input输入框模糊提示功能的实现
2017/09/25 Javascript
js实现以最简单的方式将数组元素添加到对象中的方法
2017/12/20 Javascript
使用vue自定义指令开发表单验证插件validate.js
2019/05/23 Javascript
全面分析JavaScript 继承
2019/05/30 Javascript
关于微信小程序获取小程序码并接受buffer流保存为图片的方法
2019/06/07 Javascript
vue实现页面内容禁止选中功能,仅输入框和文本域可选
2019/11/09 Javascript
Node中对非阻塞I/O、事件循环的知识点总结
2020/01/05 Javascript
Python素数检测的方法
2015/05/11 Python
Python减少循环层次和缩进的技巧分析
2016/03/15 Python
selenium+python 去除启动的黑色cmd窗口方法
2018/05/22 Python
pyshp创建shp点文件的方法
2018/12/31 Python
全网最全python库selenium自动化使用详细教程
2021/01/12 Python
Nicole Miller官方网站:纽约女装品牌
2019/09/14 全球购物
交通法规咨询中心工作职责
2013/11/27 职场文书
《桃花心木》教学反思
2014/02/17 职场文书
烹饪自我鉴定
2014/03/01 职场文书
秋天的雨教学反思
2014/04/27 职场文书
大学生作弊检讨书
2014/09/11 职场文书
给朋友的道歉短信
2015/05/12 职场文书
pdf论文中python画的图Type 3 fonts字体不兼容的解决方案
2021/04/24 Python
SQL中的三种去重方法小结
2021/11/01 SQL Server
python_tkinter弹出对话框创建
2022/03/20 Python