第7天 Post方法与上传——post.js 插件补完
前几节分析了post方法和上传的原理。下面要把代码集成到post.js插件中,但这里还有个问题,就是服务器端如何判断表单是否设置了 enctype="multipart/form-data" 属性。
post.js 插件补完
前几节分析了post方法和上传的原理。下面要把代码集成到post.js插件中,但这里还有个问题,就是服务器端如何判断表单是否设置了 enctype="multipart/form-data" 属性。仔细分析后,我们发现可以通过之前的一段代码 /(boundary=)/gi.test(contentType);
的修改,来判断是否表单设置了enctype="multipart/form-data" 属性。修改结果如下:
// 判断是否设置了enctype="multipart/form-data" 属性 var isMulti = /(boundary=)/gi.test(contentType);
这是个眼下刚遇到的问题,解决了它,我们就可以把功能进行整合了。下面是post.js插件整合后的代码。
var qs = require("querystring"); module.exports = function post(req,res,next){ var body_data = ""; req.files = {}; req.body = {}; req.on("data",function(chunk){ body_data += chunk; }) req.on("end",function(){ var contentType = req.headers["content-type"]; // isMulti 如果是true,表示是设置了enctype="multipart/form-data" 属性 var isMulti = /(boundary=)/gi.test(contentType); if(isMulti){ var boundary = RegExp["$'"]; var boundaryStandard = "--"+boundary+"\r\n"; var boundaryEnd = boundaryStandard+"--"; //删除头尾边界字符串 body_data = body_data.substring(boundaryStandard.length,body_data.length-boundaryEnd.length); var fields = body_data.split(boundaryStandard); // 头信息和体信息的之间分割字符串 var RN = "\r\n\r\n"; fields.forEach(function(field){ var index = field.indexOf(RN); // 解析出头信息块 var header = field.substring(0,index); // 从头信息中解析出表单字段的名称,也就是表单的name属性值。 /name=\"(.*?)\"/g.test(header); var fieldName = RegExp.$1; // 判断是上传的文件,还是一般的表单字段。 var isFile = /filename/g.test(header); // 解析出数据体 var body = field.substring(index+RN.length); body = body.substring(0,body.length - RN.length/2); if(isFile){ req.files[fieldName] = new Buffer(body); }else{ req.body[fieldName] = body; } }) }else{ try{ req.body = qs.parse(body_data); }catch(e){} } next(); }); }
代码和前几节相比,改动不是很大,应该能看明白。讲了这么多,又写这么多代码,希望不是我一个人在做,你也要一起做,否则我算是白费功夫了。即使你没完全弄明白所有代码,也至少模仿的写一遍,带你一起开发的目的,不是让你弄明白所有的代码意思和细节,这些说实话都能找到答案,重要的是开发的过程积累的经验和实际开发的感觉。
记住:知识是可以学到的,经验只能被传授。经验怎么传授呢,只有在实践的过程中积累,看着我做能学到经验还不够,自己还要动手再动手。编程没什么窍门,你只有编程才能精通编程。
下一节,我们做一个上传的小例子,并通过视频演示使用效果。
很赞哦! ( 0
)