当POST方式提交包含图片的表单时,如上传图片时,需要在<form>字段需要添加参数enctype="multipart/form-data",表明以二进制方式传输数据。假如表单中包含其他文本参数,如用户名username,用常规方式是无法获取post参数的,如:
<html> <head> <meta http-equiv="Content-Type" content="text/html" charset="UTF-8" /> </head> <body> <form action="/upload" enctype="multipart/form-data" method="post"> <input type="file" name="upload" /> <input type="text" name="username" value="123"/> <input type="submit" value="确定" /> </form> </body> </html>
var postdata = ""; request.addListener("data",function(postchunk){ postdata += postchunk; }); //POST结束输出结果 request.addListener("end",function(){ console.log(postdata); var params = querystring.parse(postdata); console.log(params["username"]); });
控制台显示的将是undefined,而不是我们所期望的123。因为整个表单都是以二进制传输数据,request就获得username字段的值。
这种情况,就需要引入第三方formidable模块:
var form = new formidable.IncomingForm(); form.uploadDir = uploadImgDir; form.parse(request, function(error, fields, files) { console.log("parsing done"); console.log(files.upload.path); console.log(fields["username"]); fs.renameSync(files.upload.path, uploadImgDir + "name.png"); });
在调用formidable.IncomingForm的parse方法后,其回调会返回三个参数,分别为异常,文本参数Object和图片文件数据。
在回调中使用fields["username"],就可以正常获取username参数了。