nodejs+express实现文件上传
2015-11-20 11:36
801 查看
最近项目上要使用到文件上传的功能,在使用了express框架的前提下,我们可以使用formiable库来实现文件上传的处理
在使用express框架处理请求时,我们一般情况下会再请求的中间件上面使用bodyParse这个库来对post请求进行处理,一般情况下会将请求转换成json格式的数据,但是对于上传的文件数据的处理如果使用了bodyParse.json()将其请求数据转化成json格式的话,就会报错,所以我们要将这个处理步骤去掉,因为对于post请求,http一般会将post请求分成不同的数据段进行传输,所以我们需要监听req的data事件
function uploadImg(req,res){
var imgsays = [];
var num = 0;
var isStart = false;
var ws;
var filename;
var path;
req.on('data' , function(chunk){
var start = 0;
var end = chunk.length;
var rems = [];
/*
*数据包的前面的4个/r/n之后就是文件数据,而结尾的话则是去掉\r\n--WebKitFormblabla--\r\n
*/
for(var i=0;i<chunk.length;i++){
if(chunk[i]==13 && chunk[i+1]==10){//判断是否是\r\n
num++;
rems.push(i);
if(num==4){//从文件头取出文件名
start = i+2;
isStart = true;
var str = (new Buffer(imgsays)).toString();
filename = str.match(/filename=".*"/g)[0].split('"')[1];
path = './tmp/'+filename;
ws = fs.createWriteStream(path);//打开一个文件写入流,写入到指定的文件中,如果该文件已经存在就直接写入,如果没有就新建一个文件
}else if(i==chunk.length-2){ //说明到了数据尾部的\r\n
end = rems[rems.length-2];
break;
}
}
if(num<4){
imgsays.push(chunk[i])
}
}
//处理完一段数据之后直接写入文件
if(isStart){
ws.write(chunk.slice(start , end));
}
});
req.on("end",function(){
ws.end();
logger.info("保存"+filename+"成功");
res.json({"msg":"保存成功","resultCode":"0000"});
});
}对于请求数据,一般前四个/r/n中包括的就是文件的名字等文件头信息,在前四个/r/n到后两个/r/n之间的数据就是文件的数据,我们使用边上传边写入的方式来加快文件的写入,在读到第一段数据的时候,我们就打开一个写入流,每处理完一段数据我们就将它写入文件,
在读取完post请求数据之后,我们关闭写入流,同时返回一个文件保存成功的提示
在使用express框架处理请求时,我们一般情况下会再请求的中间件上面使用bodyParse这个库来对post请求进行处理,一般情况下会将请求转换成json格式的数据,但是对于上传的文件数据的处理如果使用了bodyParse.json()将其请求数据转化成json格式的话,就会报错,所以我们要将这个处理步骤去掉,因为对于post请求,http一般会将post请求分成不同的数据段进行传输,所以我们需要监听req的data事件
function uploadImg(req,res){
var imgsays = [];
var num = 0;
var isStart = false;
var ws;
var filename;
var path;
req.on('data' , function(chunk){
var start = 0;
var end = chunk.length;
var rems = [];
/*
*数据包的前面的4个/r/n之后就是文件数据,而结尾的话则是去掉\r\n--WebKitFormblabla--\r\n
*/
for(var i=0;i<chunk.length;i++){
if(chunk[i]==13 && chunk[i+1]==10){//判断是否是\r\n
num++;
rems.push(i);
if(num==4){//从文件头取出文件名
start = i+2;
isStart = true;
var str = (new Buffer(imgsays)).toString();
filename = str.match(/filename=".*"/g)[0].split('"')[1];
path = './tmp/'+filename;
ws = fs.createWriteStream(path);//打开一个文件写入流,写入到指定的文件中,如果该文件已经存在就直接写入,如果没有就新建一个文件
}else if(i==chunk.length-2){ //说明到了数据尾部的\r\n
end = rems[rems.length-2];
break;
}
}
if(num<4){
imgsays.push(chunk[i])
}
}
//处理完一段数据之后直接写入文件
if(isStart){
ws.write(chunk.slice(start , end));
}
});
req.on("end",function(){
ws.end();
logger.info("保存"+filename+"成功");
res.json({"msg":"保存成功","resultCode":"0000"});
});
}对于请求数据,一般前四个/r/n中包括的就是文件的名字等文件头信息,在前四个/r/n到后两个/r/n之间的数据就是文件的数据,我们使用边上传边写入的方式来加快文件的写入,在读到第一段数据的时候,我们就打开一个写入流,每处理完一段数据我们就将它写入文件,
在读取完post请求数据之后,我们关闭写入流,同时返回一个文件保存成功的提示
相关文章推荐
- 使用ruby部署工具mina快速部署nodejs应用教程
- Google官方支持的NodeJS访问API,提供后台登录授权
- 浅谈Nodejs观察者模式
- nodejs教程之环境安装及运行
- nodejs中的fiber(纤程)库详解
- 基于NodeJS的前后端分离的思考与实践(五)多终端适配
- 基于NodeJS的前后端分离的思考与实践(二)模版探索
- 我的NodeJs学习小结(一)
- nodejs中实现sleep功能实例
- Nodejs异步回调的优雅处理方法
- Windows系统下使用Sublime搭建nodejs环境
- nodejs实现获取某宝商品分类
- nodejs简单实现中英文翻译
- Node.js插件的正确编写方式
- 使用upstart把nodejs应用封装为系统服务实例
- NodeJS Web应用监听sock文件实例
- Nodejs学习笔记之测试驱动
- Nodejs学习笔记之Stream模块
- 如何正确使用Nodejs 的 c++ module 链接到 OpenSSL
- Nodejs为什么选择javascript为载体语言