NodeJS HTTP模块编写POST提交表单Demo

 1. NodeJS 代码

/**
 * Created by Eric1991 on 8/1/2016.
 */


var http = require("http");
var querystring = require("querystring");

var server = http.createServer(function(req,res){

    var allData = "";

    if(req.url == "/doPost" &&  req.method.toLowerCase() == "post") {
        console.log("aaa");
        req.addListener("data",function(chunk){
            allData += chunk;
        });

        req.addListener("end",function() {
            console.log(allData);
            var obj = querystring.parse(allData);
            console.log("name..." + obj.name);
            console.log("age..." + obj.age);
            console.log("sex..." + obj.sex);
            res.end("success");
        });
    }

});

server.listen(3000,"127.0.0.1");



2. HTML 代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form method="POST" action="http://127.0.0.1:3000/doPost">
        name : <input type="text" name="name" />
        age  : <input type="text" name="age" />
        sex
        F : <input type="radio" name="sex" value="F" />
        M : <input type="radio" name="sex" value="M" />

        <input type="submit" value="submit" />
    </form>
</body>
</html>



<think>我们正在讨论Node.js中使用Multer模块处理文件上传。根据引用,Multer是一个流行的Node.js中间件,用于处理multipart/form-data类型的表单数据,主要用于文件上传。 关键点: 1. Multer安装:通过npm安装multer模块。 2. 基本使用:在Express应用中引入multer,并配置存储选项(磁盘存储或内存存储)。 3. 单文件上传:使用multer的single方法处理单个文件。 4. 多文件上传:使用array方法处理多个文件。 5. 文件过滤:可以限制上传文件的类型(如只允许图片)。 6. 文件大小限制:可以设置最大文件大小。 步骤: 1. 安装Multer:`npm install multer` 2. 引入模块并配置存储: - 磁盘存储(diskStorage)可以指定目标目录和文件名。 - 内存存储(memoryStorage)将文件存储在内存中(适用于后续处理,如上传到云存储)。 根据引用[4],磁盘存储配置示例: ```javascript const multer = require('multer'); // 配置存储 const storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, './public/upload'); // 保存路径 }, filename: function (req, file, cb) { // 设置文件名:时间戳+原始文件名 cb(null, `${Date.now()}-${file.originalname}`); } }); const upload = multer({ storage: storage }); ``` 3. 在路由中使用: - 单文件上传:使用`upload.single('fieldname')`,其中'fieldname'是表单中文件字段的名称。 - 多文件上传:使用`upload.array('fieldname', maxCount)`,maxCount表示最多文件数。 4. 文件过滤(可选): ```javascript const upload = multer({ storage: storage, fileFilter: function (req, file, cb) { // 只允许图片文件 if (file.mimetype.startsWith('image/')) { cb(null, true); } else { cb(new Error('只允许上传图片文件!'), false); } }, limits: { fileSize: 1024 * 1024 * 5 // 限制5MB } }); ``` 5. 在路由中处理上传: ```javascript // 单文件上传 app.post('/upload-single', upload.single('avatar'), (req, res) => { // 文件信息在req.file console.log(req.file); res.send('单文件上传成功!'); }); // 多文件上传 app.post('/upload-multiple', upload.array('photos', 5), (req, res) => { // 文件信息在req.files console.log(req.files); res.send('多文件上传成功!'); }); ``` 6. 错误处理:Multer会将错误传递给Express的错误处理中间件。注意捕获错误,避免应用崩溃。 注意事项: - 确保上传目录存在,否则会报错。 - 在生产环境中,通常不会将文件直接存储在服务器磁盘,而是使用云存储(如AWS S3、阿里云OSS等)。这时可以使用内存存储,然后将文件流式传输到云存储。 引用[3]提到使用Multer实现文件上传下载功能,并提供了项目创建和模块安装的步骤。 因此,我们可以总结一个完整的Multer文件上传教程。 下面开始组织回答:</think>### Node.js Multer 模块文件上传完整指南 Multer 是 Node.js 中最流行的文件上传中间件,专门处理 `multipart/form-data` 类型数据。以下是详细使用教程: #### 一、环境准备 ```bash # 创建 Express 项目 npm install express-generator -g express my-upload-app cd my-upload-app # 安装依赖 npm install npm install multer -S npm install nodemon -g # 推荐使用热重载 ``` #### 二、基础配置 ```javascript // app.js const express = require('express'); const multer = require('multer'); const path = require('path'); const app = express(); // 配置磁盘存储 const storage = multer.diskStorage({ destination: (req, file, cb) => { cb(null, './public/uploads/') // 存储目录 }, filename: (req, file, cb) => { // 文件名: 时间戳+原始名 (防重名) cb(null, `${Date.now()}-${file.originalname}`) [^4] } }); // 创建 Multer 实例 const upload = multer({ storage: storage, limits: { fileSize: 5 * 1024 * 1024 }, // 限制5MB fileFilter: (req, file, cb) => { // 文件类型过滤 const allowedTypes = ['image/jpeg', 'image/png']; if(allowedTypes.includes(file.mimetype)) { cb(null, true); } else { cb(new Error('仅支持 JPG/PNG 格式'), false); } } }); ``` #### 三、单文件上传实现 ```javascript // 单文件上传路由 app.post('/upload-single', upload.single('avatar'), (req, res) => { // 文件信息在 req.file if(!req.file) return res.status(400).send('未选择文件'); res.json({ message: '上传成功', fileInfo: { originalName: req.file.originalname, savedName: req.file.filename, size: req.file.size, path: `/uploads/${req.file.filename}` [^3] } }); }); ``` #### 四、多文件上传实现 ```javascript // 多文件上传路由 (最多5个) app.post('/upload-multiple', upload.array('photos', 5), (req, res) => { // 文件信息在 req.files (数组) const files = req.files.map(file => ({ name: file.originalname, url: `/uploads/${file.filename}` })); res.json({ count: files.length, files }); }); ``` #### 五、前端配合示例 (HTML) ```html <!-- 单文件上传 --> <form action="/upload-single" method="post" enctype="multipart/form-data"> <input type="file" name="avatar"> <button>提交</button> </form> <!-- 多文件上传 --> <form action="/upload-multiple" method="post" enctype="multipart/form-data"> <input type="file" name="photos" multiple> <button>提交</button> </form> ``` #### 六、安全注意事项 1. **文件类型验证**:必须使用 `fileFilter` 限制允许的 MIME 类型 2. **大小限制**:通过 `limits.fileSize` 防止大文件攻击 3. **病毒扫描**:对接 ClamAV 等杀毒引擎扫描上传文件 4. **存储隔离**:文件应存储在 Web 根目录外或配置访问权限 5. **文件名处理**:避免使用原始文件名,防止路径遍历攻击 #### 七、常见问题解决 1. **文件不显示**: - 确保配置静态资源目录: ```javascript app.use('/uploads', express.static('public/uploads')); ``` 2. **文件覆盖问题**: - 使用 `Date.now()` 前缀保证文件名唯一性 [^4] 3. **跨域问题**: - 添加 CORS 头信息: ```javascript app.use((req, res, next) => { res.header("Access-Control-Allow-Origin", "*"); next(); }); ``` > **调试提示**:使用 Postman 测试上传接口,选择 `form-data` 类型,添加文件字段 完整项目示例:[Node.js File Upload Demo](https://github.com/expressjs/multer/blob/master/README.md)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值