formidable模块实现了上传和编码图片和视频。它支持GB级上传数据处理,支持多种客户端数据提交。
大文件上传实例
前端
// ./html/form.html文件
<form action="/tijiao" method="post" enctype="multipart/form-data">
<label for="username" >
<!--默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件上传;只有使用了multipart/form-data,才能完整的传递文件数据-->
用户名:<input type="text" name="username" id="username"/>
</label>
<label for="password">
密码:<input type="password" name="password" id="password"/>
</label>
<div>
<h3>请选择图片</h3>
<label for="file">
<input type="file" name="file" id="file"/>
</label>
<input type="submit" value="提交"/>
</div>
</form>
node
const http=require('http');
const url=require('url');//处理url
const fs=require('fs');//读写文件 文件夹 判断文件类型等
const sd=require('silly-datetime');//格式化时间字符串
const path=require('path');//解析处理文件路径 名称 后缀等信息
const formidable=require('formidable');//处理大文件上传的文件信息;
//const sll=require('silly-dateType')
http.createServer(function(req,res){
var urlObj=url.parse(req.url,true);
//返回html页面
//var pathname=urlObj.pathname;
fs.readFile('./html/form.html',(err,data)=>{
res.end(data);
})
console.log(req.url);
//接收提交的数据
if(req.url==='/tijiao'&&req.method.toLowerCase()=='post'){
var form=new formidable.IncomingForm();//创建一个formidable对象
console.log(form);
///图片上传后的存储路径
form.uploadDir='./uploads/';
form.parse(req,function(err,fields,files){
//fields:{name:value}文本域;files:关于你所上传的这个文件的详细信息
if(err){
console.log('解析失败')
}
console.log(fields)
console.log(files);
//需求更改名字,让文件可以正常打开
var oldpath=files.file.path;
console.log(files.file.name);
var newpath=path.parse(files.file.name).name+sd.format(new Date(),"YYYYMMDDHHmmss")+path.parse(files.file.name).ext;
fs.rename(oldpath,newpath,function(err){
if(err){
console.log('改名失败')
}
})
res.end('ok');
})
}
}).listen(8080);
关于formidable模块的使用
new formidable.IncomingForm() 创建form的formidable对象
var form = new formidable.IncomingForm();
- 设置字段编码
form.encoding='utf-8';
- 通过uploadDir设置上传文件时临时文件存放的位置
form.uploadDir='/tmp/';
- 通过keepExtensions属性可以设置文件上传时临时文件的文件名是否包括扩展名。如果该值为真,即为包括扩展名,否则,就不包括扩展名
form.keepExtensions=false;
- maxFieldsSize属性限制了所有字段所占的字节数。如果超过了该字节数,将会报错。默认的字节数为2MB
form.maxFieldsSize = 10*1024*1024
- parse方法解析node.js中request请求中包含的form表单提交的数据。
form.parse(req,function(err,fields,files){
//fields:{name:value}文本域;(一般的表单:一个解析的对象)
//files:关于你所上传的这个文件的详细信息(大文件:文档,音视频,图片等的大小,类型,编码,名称,路径等)
if(err){
console.log('解析失败')
}
console.log(fields)
console.log(files);
//改名即可。。。(详情见实例)
}
创建Formidable.File对象(相当于form.parse解析后的file详细信息)
var file=new formidable.File
- file.size定义上传文件的字节数,如果文件在上传中,该属性表示已经写到磁盘上的字节数。
file.size = 0
- file.path方法定义了文件写入的路径(临时路径)。如果对该文件路径不满意,可以在fileBegin时间中修改该属性。
file.path = XXX
- file.name保存了文件在客户端中的名字
console.log(file.name)
- file.type保存了文件在客户端中的mime type
console.log(file.type)
form对象的事件
- progress事件在接收到每一个解析的数据块后触发。可以根据该事件更新进度条
var form = new formidable.IncomingForm();
form.on('progress', function(bytesReceived, bytesExpected) {
});
- field事件在接收到一个字段键值对的时候触发 eg:{name:xxx}
form.on('field', function(name, value) {
//拿到key value
});
- fileBegin事件在一个新文件开始上传时触发
form.on('fileBegin', function(name, file) {
});
- file事件在接收到一个文件字段值时触发。file是File的实例
form.on('file', function(name, file) {
});
- error在接收form表单提交的数据发生错误时触发。
form.on('error', function(err) {
});
- ‘aborted’事件是当用户中止请求时触发
form.on('aborted', function() {
});
- ‘end’事件在请求完全接收后触发
form.on('end', function() {
});