Node.js 处理POST数据比较麻烦, formidable 模块提供了简单的API。 最近要使用文件上传所以决定挖一下坑。
npm install formidable --save
一个最简单的demo
var express = require('express')
var app = express();
var formidable = require('formidable');
app.post('/upload', (req, res) => {
var form = new formidable.IncomingForm();
// 上传文件目录,相对路径或绝对路径
form.uploadDir = './upload';
form.parse(req, function(err, fields, files) {
res.json({
fields,
files
})
});
})
app.listen(3000);
API
创建对象
var form = new formidable.IncomingForm();
上传文件目录,相对路径或绝对路径
form.uploadDir = "./upload";
表单编码
form.encoding = 'utf-8';
读取type类型, 只读,multipart 或 'urlencoded 或 null
form.type
保持扩展名, 默认false
// true => upload_023fa2f76d159316b4a063b1b50e87ca.jpg
// false => upload_023fa2f76d159316b4a063b1b50e87ca
form.keepExtensions = false;
设置文本域大小, 不包括文件
// 默认是2MB
form.maxFieldsSize = 2 * 1024 * 1024;
设置最大字段,防止内存泄露,默认1000
form.maxFields = 1000;
对文件进行hash效验,默认值false不效验,可以有2个值 ‘md5’ 或 ‘sha1’
form.hash = false;
form.multiples = false;
// 前端
<input type="file" name="file" multiple>
form.parse(req, function(err, fields, files) {
res.json({
fields,
files
})
});
事件
‘progress’,对于上传文件进度条非常有用, 每当接收到数据会触发该事件,bytesReceived 服务器已经接收到了多少字节数据,bytesExpected 接收的总字节数据。 上传大文件可以看看效果。
form.on('progress', function(bytesReceived, bytesExpected) {
});
‘field’ ,接收到字段会触发该事件,不包括文件,name 是你表单的name, value 是文本域的值
form.on('field', function(name, value) {
});
‘fileBegin’ ,每当在上传流中检测到新文件时发出。如果要将文件流到其他地方,同时缓冲文件系统上的上载,请使用此事件。name是上传文件的name, file是一个对象包含文件一些信息。
form.on('fileBegin', function(name, file) {
});
‘file’ , 接收到字段或文件会触发该事件,name是上传文件的name, file是一个对象包含文件(详细)信息。
form.on('file', function(name, file) {
});
‘error’ , 错误会触发这个事件
form.on('error', function(err) {
});
‘end’ ,处理完所有数据,包括文件已上传到服务器中
form.on('end', function() {
});
‘aborted’ ,当请求中断触发该事件,注意error事件也会触发
form.on('aborted', function() {
});