node.js下四种post提交数据的方式

今天说分享的是其中一种,就是上传文件.


Express 4.0 以后,将功能原子化,高内聚,低耦合,独立出了很多中间件


今天主要分享文件上传

对于connect-multiparty ,他是专门处理此类post数据相关的依赖包,也是博客之前使用的方式 github 官方地址: https://github.com/andrewrk/connect-multiparty

安装

npm install connect-multiparty

使用

var multipart = require('connect-multiparty');
var multipartMiddleware = multipart(); app.post('/formdata',multipartMiddleware, function (req, res) {
console.log(req.body);
res.send(req.body);
});

注意

  • form标签里做这样的标识 enctype="multipart/form-data"

Connect-Busboy 中间件实现上传

github官方地址:https://github.com/mscdex/connect-busboy

install

npm install connect-busboy

使用

node.js 启动页 var busboy = require('connect-busboy');

中间件配置

app.use(busboy({
limits: {
fileSize: 10 * 1024 * 1024 // 10MB
}
}));

上传文件处

这里的代码有点bug ,已经修复,你可以忽略,直接看我的另外一篇博客 Connect-Busboy 上传文件

function upload(req, res, next) {
req.busboy.on('file', function (fieldname, file, filename, encoding, mimetype) {
var tmp_path=path.join(os.tmpDir(), path.basename(filename));
file.pipe(fs.createWriteStream(tmp_path));
file.on('end',function(){
var uuid = tool.generateUUID();
commfile.savePathFile(uuid, mimetype, tmp_path, true, function(err, fileBase64) {
if (err) {
res.json({
success:false,
url:''
});
}else{
res.json({
success: true,
url: '/file/' + uuid
});
}
});
});
}); req.pipe(req.busboy);
}

出自:node.js 在 Express4.0 框架使用 Connect-Busboy 实现文件上传

> ## 说明 >> req.busboy 会监听几个事件 * req.busboy.on('file',function(fieldname, file, filename, encoding, mimetype){ .....} *上传文件时监听此事件* * req.busboy.on('field',function(key, value, keyTruncated, valueTruncated){ .... } *监听form表单中非文件类型其他参数*

上面的上传示例只用到了处理文件类型的字段,没有涉及到非文件类型的字段.所以只监听了 file 事件.

req.busboy.on('file’, function (fieldname, file, filename, encoding, mimetype)

上面的事件会在 enctype="multipart/form-data" 的 form 表单post 提交数据时被监听

function(fieldname, file, filename, encoding, mimetype) 回调函数中是服务器获取到的文件相关处理信息 fieldname 是一个上传文件的标识 file 是上传的文件流句柄 filenname 是文件名(包含扩展名) encoding 是文件编码类型 mimetype 是文件mime类型 var tmp_path=path.join(os.tmpDir(), path.basename(filename)); 根据系统临时目录 和 文件名,来定位文件临时存放路径


os.tmpDir() 是当前系统临时目录,需要引用 require(‘os’); path.basename(filename) 是提取filename 路径中最后一个 / 之后的文件名,比如 /aa/bb/cc.jpg 此方法最后得到的是 cc.jpg ,需 require(‘path’)


file.pipe(fs.createWriteStream(tmp_path)); 根据上面的临时文件目录,把上传文件临时保存起来 ,这里用到了 流 的 pipe 它就像一个水管子能源源不断的把字节流传递给文件流,直到文件被写入成功为止 file.on('end’,function(){ …} 此事件是在 文件 被写入完成时触发的事件. 当文件被写入临时目录成功后,马上触发上面的事件,我在这里 调用 commfile.savePathFile 方法把文件读取并写入到了数据库

如果你的文件是直接存放在服务器指定目录,那么完全没必要指定临时目录,再去拷贝,直接一步到位,存放在指定上面目录即可

我之所以用这种方法,是因为我的图片文件全部保存在数据库中

如果此上传方法的入口开放给用户,请注意根据 filename 后缀名 及 mimetype 来判断文件类型,进行过滤

 

node.js 在 Express4.0 框架使用 Connect-Busboy 实现文件上传的更多相关文章

  1. node.js+react全栈实践-Form中按照指定路径上传文件并

    书接上回,讲到“使用同一个新增弹框”中有未解决的问题,比如复杂的字段,文件,图片上传,这一篇就解决文件上传的问题.这里的场景是在新增弹出框中要上传一个图片,并且这个上传组件放在一个Form中,和其他文 ...

  2. Asp.Net Core 3.0 学习3、Web Api 文件上传 Ajax请求以及跨域问题

    1.创建Api项目 我用的是VS2019 Core3.1 .打开Vs2019 创建Asp.Net Core Web应用程序命名CoreWebApi 创建选择API 在Controller文件夹下面添加 ...

  3. Dreamer 3.0 支持json、xml、文件上传

    自己写的框架,功能类似Struts2.x 下载地址:http://pan.baidu.com/share/link?shareid=3273223286&uk=470382596 新增功能: ...

  4. 巧用 Jersey RESTful WebService框架解决文件上传乱码

    一.当我们使用jersey框架封装的restful进行文件上传时,会出现中文乱码,试用了过滤器设置编码都不管用.仔细想了很久解决办法,就用一个servelt来代替这个上传的restful接口实现上传的 ...

  5. SSH,SSM框架文件上传

    一.了解文件上传 1.1        什么是文件上传 将本地文件通过流的形式写到服务器上 1.2        文件上传的技术 JspSmartUpload: 其组件是应用jsp进行B/S程序开发过 ...

  6. js实现简单的文件上传

    文件下载:https://www.cnblogs.com/xiaomili/p/10521160.html  html: <form name="form1" id=&quo ...

  7. 【Servlet3.0新特性】第03节_文件上传

    这是一个Web Project 首先是web.xml <?xml version="1.0" encoding="UTF-8"?> <web- ...

  8. Servlet3.0 multipart 文件上传技术

    Servlet3.0 javaConfig配置 传统的servlet都是在web.xml中配置,从Servlet 3.0开始提供了ServletContainerInitializer接口,允许使用代 ...

  9. Spring boot2.0 设置文件上传大小限制

    今天把Spring boot版本升级到了2.0后,发现原来的文件上传大小限制设置不起作用了,原来的application.properties设置如下: spring.http.multipart.m ...

随机推荐

  1. Centos7 Openstack - (第一节)基本环境配置

    Centos7 install Openstack - (第一节)基本环境配置 我的blog地址:http://www.cnblogs.com/caoguo 根据openstack官方文档配置 官方文 ...

  2. ios开发错误笔记

    今天的奇葩错误,最后解决方式是删除了手机上面的快捷方式,然后再clean,然后再重启了xcode.无语了,xcode也经常出些奇葩问题,真无语啊. ios技术交流群:378501081..期待你加入. ...

  3. html5 搖一搖

    <script> // 首先在页面上要监听运动传感事件 function init(){ if (window.DeviceMotionEvent) { // 移动浏览器支持运动传感事件 ...

  4. 服务器bonding

    server cat /etc/sysconfig/network-scripts/ifcfg-bond0 DEVICE=bond0 IPADDR=211.98.243.231 NETMASK=255 ...

  5. chrome浏览器设置小于12号的字体不起作用?

    在某些chrome浏览器下,css里设置的10号字体竟然不起作用!仍显示12号大小,对比firefox.ie6.7.8.9,他们的显示都是好的. 要是你也碰到这问题,可以这样解决: -webkit-t ...

  6. WP8_检测列表是否滑动

    One of the UI features of lists on Windows Phone 7 is that the "scroll bars" don't really ...

  7. c#面试题及答案

    1:a=10,b=15,在不用第三方变量的前提下,把a,b的值互换2:已知数组int[] max={6,5,2,9,7,4,0};用快速排序算法按降序对其进行排列,并返回数组3:请简述面向对象的多态的 ...

  8. VS2013 试用版到期 解决办法

    摘自:http://jingyan.baidu.com/article/fec7a1e5100b481190b4e7d9.html 输入密钥:BWG7X-J98B3-W34RT-33B3R-JVYW9

  9. PHP超时处理全面总结(转)

    [ 概述 ] 在PHP开发中工作里非常多使用到超时处理到超时的场合,我说几个场景: 1. 异步获取数据如果某个后端数据源获取不成功则跳过,不影响整个页面展现 2. 为了保证Web服务器不会因为当个页面 ...

  10. 理解DOM中的事件流

    浏览器发展到第四代时(IE4和Netscape Communicator 4),浏览器团队遇到一个很有意思的问题:页面的哪一部分会拥有特定的事件?想象下在一张纸上有一组同心圆,如果你把手指放在圆心上, ...