POST请求
相比较GET请求,POST请求比较复杂。因为 Node.js认为,使用POST请求时,数据量会比较多。为了追求极致的效率,它将数据拆分成为了众多小的数据块( chunk),然后通过特定的事件,将这些小数据块有序传递给回调函数。
var postdata="";
reg. addlistener("data",function(chunk){
postdata +=chunk;
})
reg. addlistener("end", function(){
console. log(postdata);
var param=querystring.parse(postdata);
res. writehead(200, {"content-type": "text/html; charset=utf-8"})
res.end(param.name) ;
})
var alldata="";
//下面是post请求接收的一个公式
//node为了追求极致,它是一个小段一个小段接收的。
//接受了ー小段,可能就给别人去服务了。防止一个过大的表单阻塞了整个进程
req.addlistener("data", function(chunk){
alldata+=chunk;
})
//全部传输完毕
req. addlistener("end", function(){
console. log(alldata.tostring();
res.end("succ");
})
原生写POST处理,比较复杂,要写两个监听。文件上传业务比较难写。所以,用第三方模块:formidable 。
只要涉及文件上传,那么form标签要加一个属性:
<form action=p: /127.0.0.1/dopost"method=post "enctype"multipar/form-data">.
POST请求提交表单数据与上传图片
HTML 部分
<body>
<form action="http://127.0.0.1/dopost" method="post" enctype="multipart/form-data">
<!-- 只要涉及文件上传 form标签要加 enctype="multipart/form-data"-->
<p>
姓名:<input type="text" name="name">
</p>
<p>
性别:<input type="radio" name="sex" value="男">男
<input type="radio" name="sex" value="女">女
</p>
<p>爱好:
<input type="checkbox" name="hb" value="睡觉"> 睡觉
<input type="checkbox" name="hb" value="游戏"> 游戏
<input type="checkbox" name="hb" value="旅游"> 旅游
</p>
<p>
<input type="file" name="img">上传图片
</p>
<p>
<input type="submit">
</p>
</form>
</body>
JS部分(不包含接收图片的逻辑)
var http = require("http");
var querystring = require("querystring");
//创建服务器
var server = http.createServer(function(req, res) {
//如果访问地址是/dopost 并且请求类型是这个POST
if (req.url == "/dopost" && req.method == "POST") {
//注意:'/dopost' 前面带 / , 'POST'是大写
//拼接请求到的数据
var alldata = "";
//下面是post请求接收的一个公式
//node为了追求极致,它是一个小段一个小段接收的。
//接收了一个小段,可能就给别人去服务了。防止一个过大的表单阻塞I/O
req.addListener("data", function(chunk) {
alldata += chunk;
//console.log(chunk);
})
//数据接收完成
req.addListener("end", function(chunk) {
var datastring = alldata.toString();
//console.log(datastring);
res.end("succ")
//将datastring转成一个对象
var dataobj = querystring.parse(datastring);
// console.log(dataobj)
// console.log(dataobj.name)
// console.log(dataobj.sex)
// console.log(dataobj.hb)
})
} else {
console.log("有错误");
// console.log(req.url);
// console.log(req.method);
}
})
server.listen(80, "127.0.0.1");
JS部分(包含接收图片的逻辑)
var http = require("http");
var querystring = require("querystring");
var formidable = require('formidable'); //需要安装 npm install formidable@latest
var util = require("util");
var fs = require("fs");
var sd = require("silly-datetime"); //需要安装 npm install silly-datetime@latest
var path = require("path");
//创建服务器
var server = http.createServer(function(req, res) {
//如果访问地址是/dopost 并且请求类型是这个POST
if (req.url == "/dopost" && req.method.toLowerCase() == "post") {
//creates a new incoming form
var form = new formidable.IncomingForm();
//设置文件上传存放地址
form.uploadDir = "./imgs";
//执行里面的回掉函数的时候,表单已经完全接受完毕
form.parse(req, function(err, fields, files) {
//所有文本域、单选框 都在fields存放;
//所有文件域 都在files
console.log(fields);
console.log(files);
//输出的结果
// { name: 'yangyi', sex: '男', hb: '旅游' }
// { img:
// File {
// _events: [Object: null prototype] {},
// _eventsCount: 0,
// _maxListeners: undefined,
// size: 19907,
// path: 'imgs\\upload_beb355942d36d421df58d0fa0a34d262',
// name: 'logo.png',
// type: 'image/png',
// hash: null,
// lastModifiedDate: 2019-08-03T03:54:50.260Z,
// _writeStream:
// WriteStream {
// _writableState: [WritableState],
// writable: false,
// _events: [Object: null prototype] {},
// _eventsCount: 0,
// _maxListeners: undefined,
// path: 'imgs\\upload_beb355942d36d421df58d0fa0a34d262',
// fd: null,
// flags: 'w',
// mode: 438,
// start: undefined,
// autoClose: true,
// pos: undefined,
// bytesWritten: 19907,
// closed: false } } }
// console.log(util.inspect({
// fields: fields,
// files: files
// }));
//时间 使用了第三方模块 silly-datatime
var ttt = sd.format(new Date(), "YYYYMMDDHHmmss");
var ran = parseInt(Math.random() * 89999 + 10000);
var extname = path.extname(files.img.name);
// console.log('CSyangyi' + ttt + ran + extname);
// console.log(__dirname);
//执行给上传的img改名
var oldpath = __dirname + "/" + files.img.path;
//新的路由由三个部分组成:时间戳 随机数 拓展名
var newpath = __dirname + "/imgs/" + ttt + ran + extname;
//console.log(oldpath, newpath);
//改名
fs.rename(oldpath, newpath, function(err) {
if (err) {
throw Error("改名失败");
}
res.writeHead(200, {
'content-type': 'text/plain'
});
res.end('succ');
});
});
} else if (req.url == "/") {
//呈递form.html页面
fs.readFile("./form.html", function(err, data) {
res.writeHead(200, {
"content-type": 'text/html'
});
res.end(data);
})
} else {
res.writeHead(404, {
'content-type': 'text/html'
});
res.end("404");
}
})
server.listen(80, "127.0.0.1");
网友评论