node.js 之 multer 图片上传组件示例 【多文件上传】
多文件上传:
views/admin/user/add.html :
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>多文件上传</title> </head> <body> <h2>多文件上传:</h2> <form action="/admin/user/doAdd" method="post" enctype="multipart/form-data"> <span>名称:</span> <input type="text" name="title" id="title"> <br><br> <span>图片1:</span> <input type="file" name="pic1" id="pic1"> <br><br> <span>图片2:</span> <input type="file" name="pic2" id="pic2"> <br><br> <span>图片3:【上传多个:input 里设置 multiple="multiple"】 </span> <input type="file" name="photos" id="photos" multiple="multiple"> <br><br> <span>描述:</span> <textarea name="desc" id="desc" cols="30" rows="1"></textarea> <br><br> <input type="submit" value="提交"> </form> </body> </html>
model/tools.js :
var multer = require("multer"); const path = require("path"); // 引入时间格式化组件 const dayjs = require("dayjs"); // 引入mkdirp const mkdirp = require("mkdirp"); let tools = { multer() { var storage = multer.diskStorage({ // 配置上传的目录 destination: async (req, file, cb) => { // 1、获取当前日期 例如 20210102 var day = dayjs(new Date()).format("YYYYMMDD"); let dir = path.join("static/upload", day); // 2、按照日期生成图片的存储目录 mkdirp 是异步方法,返回的是promise,要用 async await 解析 await mkdirp(dir); cb(null, dir); //上传之前目录必须存在 /* 不需要生成日期文件夹的可以 */ }, filename: (req, file, cb) =>{ var now = new Date(); var month_int = now.getMonth() + 1; //月份从0开始算,0是1月份,要加一; // 用时间当做名称,也可以用 Date.now() 时间戳当名称 var time = dayjs(new Date()).format("YYYYMMDDHHmmssSSS") let extname = path.extname(file.originalname); cb(null, time + extname); // cb(null, Date.now() + extname); }, }); var upload = multer({ storage: storage }); return upload; }, md5() {}, }; module.exports = tools;
routes/admin/user.js :
const express = require("express"); const tools = require("../../model/tools"); var router = express.Router(); router.get("/", (req, res) => { res.send("用户列表"); }); router.get("/add", (req, res) => { res.render("admin/user/add"); }); router.get("/edit", (req, res) => { res.send("修改用户"); }); var cpUpload = tools.multer().fields([ { name: "pic1", maxCount: 1 }, { name: "pic2", maxCount: 1 }, { name: "photos", maxCount: 10 }, ]); // var cpUpload = tools.multer().array("photos", 12); router.post("/doAdd", cpUpload, (req, res) => { console.log(req.body); res.send({ body: req.body, file1: req.files["pic1"], file2: req.files["pic2"], file3: req.files["photos"], }); }); router.post("/doEdit", (req, res) => { res.send("执行修改"); }); module.exports = router;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了