node.js表单处理和文件上传

本文详细介绍了如何在Node.js中处理GET和POST请求的表单数据,包括GET请求的表单提交和数据解析,POST请求的实现,以及使用formidable库处理文件上传。还讲解了如何使用Express解析POST提交的JSON格式数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、get请求

表单提交HTML

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>表单提交</title>
</head>
<body>
  <form action="http://127.0.0.1:2080/" method="GET">
     <input type="text" name="name"><br>
     <input type="text" name="age">
     <input type="radio" name="sex" value="男"><input type="radio" name="sex" value="女"><br>
     <input type="submit">
  </form>
</body>
</html>



node.js服务器搭建

这里重要利用了url模块,其中url.parse(req.url, true).query,
url.parse()第二个参数设置为true,则 query 属性总会通过 querystring 模块的 parse() 方法生成一个对象。 如果为 false,则返回的 URL 对象上的 query 属性会是一个未解析、未解码的字符串。 默认为 false。

const http = require('http');
const url = require('url');

const server = http.createServer((req, res) => {
   const queryObj = url.parse(req.url, true).query;
   res.writeHead(200, {
       'Content-Type': 'text/html; charset=UTF8'
   })
   const name = queryObj.name;
   const age = queryObj.age;
   const sex = queryObj.sex;
   res.write(`服务器接受到提交: name:${name}, age: ${age}, sex: ${sex}`);
   res.end();
})
server.listen(2080, '127.0.0.1');


运行

命令行启动服务器 ,打开html文件,注意不需要写服务器域名

这里写图片描述

填写表单,提交数据,当点击提交后,请求的的url直接从file:///Users/shaojinghong/Desktop/form.html
变成http://127.0.0.1:2080/?name=jinghong&age=22&sex=%E7%94%B7

这里写图片描述


二、POST请求

搭建服务端

post请求服务端固定写法: req.addListener(‘data’, (chunk) => { })和req.addListener(‘end’, () => {});用来一段一段接受buffer格式的表单数据,然后调用toString()得到字段name=%E6%99%AF%E6%B4%AA&%E7%94%B7=on,然后调用 querystring模块的parse(dataString)将这种字符串转换成对象

const http = require('http');
const querystring = require('querystring');
const server = http.createServer((req, res) => {
    if (req.url == '/dopost' && req.method.toLowerCase() == 'post'){
      // 如果访问的地址是这个,并且请求方法是post
      let allData = '';
      // 下面是为了追求极致,是一小段一小段chunk接收的
      req.addListener('data', (chunk) => {
          // chunk为buffer类型
          allData += chunk;
          console.log(chunk); // <Buffer 6e 61 6d 65 3d 25 45 36 25 39 39 25 41 46 25 45 36 25 42 34 25 41 41 26 25 45 37 25 39 34 25 42 37 3d 6f 6e>
      });
      // 表单chunk全部接收完毕
      req.addListener('end', () => {
          let dataString = allData.toString();
          console.log(dataString);// name=%E6%99%AF%E6%B4%AA&%E7%94%B7=on
          let dataobj = querystring.parse(dataString);
          console.log(dataobj); // { name: '景洪', '男': 'on' }
          res.end('success');
      })

    }
});
server.listen(8080, '127.0.0.1'); 



编写表单HTML

<!DOCTYPE html>
<html>
<head>
    <title>post实验</title>
    <meta charset="utf-8">
</head>
<body>
  <form action="http://127.0.0.1:8080/dopost" method="post">
   <p>
      姓名:<input type="text" name="name">
   </p>
   <p>
      性别:
      <input type="radio" name="男"><input type="radio" name="女"></p>
   <p>
      <input type="submit">
   </p>
   </form>
</body>
</html>



运行server,提交表单


这里写图片描述

这里写图片描述



三、post上传文件

编写HTML表单文件

注意使用 < form action=”http://127.0.0.1:8080/dopost” method=”post” enctype=”multipart/form-data” >和< input type=”file” name=”picture” >标签
关于file上传标签说明:http://www.w3school.com.cn/jsref/dom_obj_fileupload.asp

具体代码:

<!DOCTYPE html>
<html>
<head>
    <title>post实验</title>
    <meta charset="utf-8">
</head>
<body>
  <form action="http://127.0.0.1:8080/dopost" method="post" enctype="multipart/form-data">
   <p>
      姓名:<input type="text" name="name">
   </p>
   <p>
      性别:
      <input type="radio" name="男"><input type="radio" name="女"></p>
   <p>
      图片上传
      <input type="file" name="picture">
   </p>
   <p>
      <input type="submit">
   </p>
   </form>
</body>
</html>



编写node服务器端代码,使用formidable包,进行post数据的接收、解析

formidable: https://www.npmjs.com/package/formidable

const http = require('http');
const querystring = require('querystring');
const formidable = require('formidable');
const server = http.createServer((req, res) => {
    if (req.url == '/dopost' && req.method.toLowerCase() == 'post'){
        var form = new formidable.IncomingForm();
        // 设置文件保存路径,相对路径
        form.uploadDir = "./uploads";
        // 解析表单, fields表示文本域,files表示文件域
        form.parse(req, function(err, fields, files) {
          console.log(fields, files);
          res.writeHead(200, {'content-type': 'text/plain'});
          res.write('received upload:\n\n');
          res.end();
        });

    }
});
server.listen(8080, '127.0.0.1'); 

这里写图片描述



使用express解析post提交的数据为json格式

这里需要使用body-parser这个中间件

const express = require('express');
// 使用中间件之前先npm install body-parser
const bodyParser = require('body-parser');

const app = new express();

//使用中间件
app.use(bodyParser.urlencoded({ extended: false }))

app.use(bodyParser.json());

app.post('/', (req, res) => {
    console.log(req.body);
    res.send();
});

app.listen(3000);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值