视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
NodeJsform-data格式传输文件的方法
2020-11-27 19:34:43 责编:小采
文档


这篇文章主要介绍了NodeJs form-data格式传输文件的方法,内容挺不错的,现在分享给大家,也给大家做个参考。

本文介绍了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_d6dcc755fcd36156c6814aafb7685e',
 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);//可读流通过管道写入可写流

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

下载本文
显示全文
专题