- node.js在处理客户端以POST方式提交的数据时,比较复杂,要写两个监听(data、end),并且要处理上传的图片、文件时也比较艰难
- 常用第三方模块包formidable来处理客户端以POST方式提交的表单、文件、图片等
- 安装
npm install formidable
- 引入
const formidable = require('formidable');
- 在服务器端引入formidable
const formidable = require('formidable');
- 在post请求中
① 实例化
② 指定文件上传文件夹let form = new formidable.IncomingForm();
③ 指定文件后缀是否保存form.uploadDir = path.join(__dirname, 'dir');
④ 解析request发送过来的数据form.keepExtensions = true;
form.parse(req, function (err, fields, files) { if (err) { throw err; } console.log(fields); console.log(files); res.end('success'); });
- 表单提交的过程中涉及文件或者图片上传,则一定要设置表单头,即在form标签上加属性为
enctype="multipart/form-data"
,否则文件或图片会上传时效 - < input type=“file” name=“uploadImg”>,当中的name属性一定要赋值
- 前端传递数据的时候,不可以使用序列化,要是用
new FormData($form[0]),
- 前端发起ajax请求的时候,不要将数据处理转化成一个查询字符串
processData: false,
- 前段发起ajax请求的时候,不要设置请求头
contentType:false
-
前端界面
index2.ejs<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title></title> </head> <body> <form action="/" method="post" enctype="multipart/form-data"> <label> 时间: <input type="text" name="l_name"> </label> <br> <label> 地点: <input type="text" name="l_address"> </label> <br> <label> 人物: <input type="file" name="l_person"> </label> <br> <input id="btn_sub" type="button" value="提交"> </form> <script src="node_modules/jquery/dist/jquery.js"></script> <script> $('#btn_sub').on('click', function () { var $form = $('form'); $.ajax({ url: $form.attr('action'), type: $form.attr('method'), data: new FormData($form[0]), // 不要处理转化成一个查询字符串 processData: false, contentType: false, success: function (data) { console.log(data); } }) }); </script> </body> </html>
-
服务器代码
const express = require('express'); const path = require('path'); const fs = require('fs'); const formidable = require('formidable'); const app = express(); app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'ejs'); app.use('/node_modules', express.static(path.join(__dirname, '/node_modules'))); app.get('/', (req, res, next) => { res.render('index2'); }); app.post('/', (req, res, next) => { // 1. 创建实例 let form = new formidable.IncomingForm(); // 2. 指定文件的上传文件夹 form.uploadDir = path.join(__dirname, 'dir'); // 3. 指定文件的后缀 form.keepExtensions = true; // 4. 解析request发送过来的数据 form.parse(req, function (err, fields, files) { if (err) { throw err; } console.log(fields); console.log(files); res.end('success'); }); }); app.listen(2000, () => { console.log('running!') });