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

这篇文章主要介绍了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_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);//可读流通过管道写入可写流

登录后复制

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

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

关于Nodejs服务端字符编解码和乱码的处理

node.js 利用流实现读写同步,边读边写的功能

关于nodejs socket服务端和客户端的简单通信功能

以上就是NodeJs form-data格式传输文件的方法的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2747893.html

(0)
上一篇 2025年3月8日 04:31:17
下一篇 2025年3月8日 04:31:24

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 关于node.js中fs.stat与fs.fstat的区别

    fs.stat和fs.fstat他们都是用来获取文件的状态信息,下面这篇文章主要给大家介绍了关于node.js中fs.stat与fs.fstat区别的相关资料,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。…

    编程技术 2025年3月8日
    200
  • node-mysql中防止SQL注入的方法

    大家都知道sql注入对于网站或者服务器来讲都是一个非常危险的问题,如果这一方面没处理好的话网站可能随时给注入了,所以这篇文章就给大家总结了node-mysql中防止sql注入的几种常用做法,有需要的朋友们可以参考借鉴。 SQL注入简介 SQ…

    编程技术 2025年3月8日
    200
  • nodejs用ztree实现在两个div之间移动

    本文介绍了“node在两个p之间移动,用ztree实现”的方法,需要的朋友可以参考一下 实现思路: 1、ztree中节点是通过一个json的Array作为数据源、,所以直接操作json字符串,然后转为json对象数组。 2、然后用新构成的j…

    编程技术 2025年3月8日
    200
  • 关于Node.js连接postgreSQL并进行数据操作的介绍

    这篇文章就给大家介绍了关于node.js如何连接postgresql数据库,并进行数据操作的方法,有需要的朋友们可以参考借鉴,下面来一起看看吧。 自从MySQL被Oracle收购以后,PostgreSQL逐渐成为开源关系型数据库的首选 前言…

    编程技术 2025年3月8日
    200
  • 如何用node批量压缩html页面?

    本篇文章给大家带来的内容是关于如何用node批量压缩html页面,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 最近在写一个用了layui的后台管理系统。因为某些原因,html,css,js都写在。html里,并且没有用到…

    2025年3月8日
    200
  • Node.js中Stream-可读流的使用

    可读流是生产数据用来供程序消费的流。常见的数据生产方式有读取磁盘文件、读取网络请求内容等,看一下前面介绍什么是流用的例子: const rs = fs.createReadStream(filePath); 登录后复制 rs 就是一个可读流…

    编程技术 2025年3月7日
    200
  • Node服务中如何监控本地环境及生产环境的内存变化?

    当使用 Node 在生产环境作为服务器语言时,并发量过大或者代码问题造成 OOM (out of memory) 或者 CPU 满载这些都是服务器中常见的问题,此时通过监控 CPU 及内存,再结合日志及 Release 就很容易发现问题。 …

    2025年3月7日 编程技术
    200
  • Deno中如何使用 Node 模块?

    尽管方法不是很好,但有时别无选择。 Deno 是基于 Web 技术的服务器端代码执行环境。 Node 使用 JavaScript 与 commonjs 模块,并把 npm/yarn 作为其包管理器。【视频教程推荐:node js教程 】De…

    2025年3月7日
    200
  • Controller层中Node怎么进行数据校验?

    【视频教程推荐:node js教程 】 幽默风趣的后端程序员一般自嘲为 CURD Boy。CURD, 也就是对某一存储资源的增删改查,这完全是面向数据编程啊。 真好呀,面向数据编程,往往会对业务理解地更加透彻,从而写出更高质量的代码,造出更…

    2025年3月7日
    200
  • 通过Node+Redi实现API速率限制

    速率限制可以保护和提高基于API的服务的可用性。如果你正在与一个API对话,并收到HTTP 429 Too Many Requests的响应状态码,说明你已经被速率限制了。这意味着你超出了给定时间内允许的请求数量。你需要做的就是放慢脚步,稍…

    2025年3月7日 编程技术
    100

发表回复

登录后才能评论