nodejs+express实现文件上传
来源:互联网 发布:淘宝开通直播间 编辑:程序博客网 时间:2024/04/30 00:08
最近项目上要使用到文件上传的功能,在使用了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请求数据之后,我们关闭写入流,同时返回一个文件保存成功的提示
1 0
- nodejs+express实现文件上传
- nodejs express+ejs+formidable实现文件上传
- NodeJS express+multer实现文件上传
- nodeJS中express+busboy实现文件上传
- nodejs express 上传文件
- nodejs express 文件上传处理
- 使用nodejs+express(4.x+)实现文件上传
- 使用nodejs+express(4.x+)实现文件上传
- nodejs express 4.0+的文件上传
- nodejs + Express 用 dropzone.js 上传文件
- Nodejs express、html5实现拖拽上传
- nodejs实现文件上传
- 基于NodeJs的Express及Webuploader实现大文件分片上传与合并(一)
- Express、Nodejs服务器上传文件时出现Unexpected field
- Nodejs进阶 基于express+multer的文件上传
- 基于NodeJs的Express及Webuploader实现大文件分片上传与合并(二)——组件化实现
- nodejs+express+ajax实现图片上传及显示
- nodejs + express + 上传图片功能
- 第一部分:Hibernate入门
- [BetterExplained]如何有效地记忆与学习
- Table td下用rowspan的一二问题
- Mybatis使用经验分享之批量操作
- 【Android学习之道】 拍照后Bitmap图片模糊或者缩小的问题解决
- nodejs+express实现文件上传
- RelativeLayout和LinearLayout的属性
- iOS 之应用性能调优的25个建议和技巧
- ADO.Net基础
- Kafka入门经典教程
- ADO.Net连接
- linux理论知识
- 名校家教-android 多渠道包分发
- Android广播机制Broadcast详解