Express 结合 multer 上传图片

一、 Multer 模块介绍

Multer 是一个 node.js 中间件,用于处理 multipart/form-data 类型的表单数据,它主要用 于上传文件。
它是写在 busboy 之上非常高效。
注意: Multer 不会处理任何非 multipart/form-data 类型的表单数据。
https://www.npmjs.com/package/multer

二、 Express 上传文件模块 multer 的使用

  1. 安装 multer npm install --save multer
  2. 引入配置 multer 模块 :
var multer = require('multer') //配置 
var storage = multer.diskStorage({ //文件保存路径 注意路径必须存在destination: function (req, file, cb) { cb(null, 'public/upload/') },//修改文件名称 filename: function (req, file, cb) { var fileFormat = (file.originalname).split("."); cb(null,Date.now() + "." + fileFormat[fileFormat.length - 1]); } })
var upload = multer({ storage: storage 
})
  1. 使用 multer
router.post('/doAdd', upload.single("pic"), function (req, res) { res.send({ file: req.file,//返回文件名 body: req.body }) });

第一种使用方式:无法指定上传文件的后缀名

在这里插入图片描述

在这里插入图片描述

第二种:可以指定文件的后缀名

在这里插入图片描述

const express = require("express")
var multer  = require('multer')
const path = require('path')
// var upload = multer({ dest: 'static/upload' }) 
// 上传文件之前目录必须存在
var storage = multer.diskStorage({// 配置上传的文件保存的目录destination: function (req, file, cb) {cb(null, 'static/upload')},// 修改上传的文件的文件名filename: function (req, file, cb) {// 1.获取后缀名let extname = path.extname(file.originalname)// 2.根据时间戳生成文件名cb(null, Date.now()+ "." + extname)}})
var upload = multer({ storage: storage })
var router = express.Router()
router.get("/",(req, res)=> {res.send("导航列表")
})
router.get("/add",(req, res)=> {res.render("admin/nav/add.html")
})
router.post("/doAdd", upload.single("pic") ,(req, res)=> {// 获取表单传过来的数据var body = req.body;console.log(body)console.log(req.file)res.send({body: req.body,file: req.file})
})router.get("/edit",(req, res)=> {res.send("修改导航")
})router.post("/doEdit",(req, res)=> {res.send("执行修改导航")
})module.exports = router

在这里插入图片描述
tool.js :

var multer = require('multer')
const path = require('path')let tools = {multer() {// var upload = multer({ dest: 'static/upload' }) // 上传文件之前目录必须存在var storage = multer.diskStorage({// 配置上传的文件保存的目录destination: function (req, file, cb) {cb(null, 'static/upload')},// 修改上传的文件的文件名filename: function (req, file, cb) {// 1.获取后缀名let extname = path.extname(file.originalname)// 2.根据时间戳生成文件名cb(null, Date.now() + "." + extname)}})var upload = multer({ storage: storage })return upload}
}module.exports = tools

nav.js:

const express = require("express")
const tool = require("../../model/tool")var router = express.Router()
router.get("/",(req, res)=> {res.send("导航列表")
})
router.get("/add",(req, res)=> {res.render("admin/nav/add.html")
})
router.post("/doAdd", tool.multer().single("pic") ,(req, res)=> {// 获取表单传过来的数据var body = req.body;console.log(body)console.log(req.file)res.send({body: req.body,file: req.file})
})
// var multer  = require('multer')
// const path = require('path')
// // var upload = multer({ dest: 'static/upload' }) 
// // 上传文件之前目录必须存在
// var storage = multer.diskStorage({
//     // 配置上传的文件保存的目录
//     destination: function (req, file, cb) {
//       cb(null, 'static/upload')
//     },
//     // 修改上传的文件的文件名
//     filename: function (req, file, cb) {
//         // 1.获取后缀名
//         let extname = path.extname(file.originalname)//         // 2.根据时间戳生成文件名
//       cb(null, Date.now()+ "." + extname)
//     }
//   })
// var upload = multer({ storage: storage })// router.post("/doAdd", upload.single("pic") ,(req, res)=> {
//     // 获取表单传过来的数据
//     var body = req.body;
//     console.log(body)
//     console.log(req.file)
//     res.send({
//         body: req.body,
//         file: req.file
//     })
// })router.get("/edit",(req, res)=> {res.send("修改导航")
})router.post("/doEdit",(req, res)=> {res.send("执行修改导航")
})module.exports = router

三、 Express 按照日期生成上传文件目录

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

tool.js:

var multer = require('multer')
const path = require('path')
const sd = require('silly-datetime')
const mkdirp = require('mkdirp')let tools = {multer() {// var upload = multer({ dest: 'static/upload' }) // 上传文件之前目录必须存在var storage = multer.diskStorage({// 配置上传的文件保存的目录destination: async function (req, file, cb) {// 1.获取当前日期 20210417let day = sd.format(new Date(), 'YYYYMMDD')let dir = path.join('static/upload', day)// 2.按照日期生成图片存储目录await mkdirp(dir) // mkdirp()是一个异步方法cb(null, dir)},// 修改上传的文件的文件名filename: function (req, file, cb) {// 1.获取后缀名let extname = path.extname(file.originalname)// 2.根据时间戳生成文件名cb(null, Date.now() + "." + extname)}})var upload = multer({ storage: storage })return upload}
}module.exports = tools

nav.js:

const express = require("express")
const tool = require("../../model/tool")var router = express.Router()
router.get("/",(req, res)=> {res.send("导航列表")
})
router.get("/add",(req, res)=> {res.render("admin/nav/add.html")
})
router.post("/doAdd", tool.multer().single("pic") ,(req, res)=> {// 获取表单传过来的数据var body = req.body;console.log(body)console.log(req.file)res.send({body: req.body,file: req.file})
})
// var multer  = require('multer')
// const path = require('path')
// // var upload = multer({ dest: 'static/upload' }) 
// // 上传文件之前目录必须存在
// var storage = multer.diskStorage({
//     // 配置上传的文件保存的目录
//     destination: function (req, file, cb) {
//       cb(null, 'static/upload')
//     },
//     // 修改上传的文件的文件名
//     filename: function (req, file, cb) {
//         // 1.获取后缀名
//         let extname = path.extname(file.originalname)//         // 2.根据时间戳生成文件名
//       cb(null, Date.now()+ "." + extname)
//     }
//   })
// var upload = multer({ storage: storage })// router.post("/doAdd", upload.single("pic") ,(req, res)=> {
//     // 获取表单传过来的数据
//     var body = req.body;
//     console.log(body)
//     console.log(req.file)
//     res.send({
//         body: req.body,
//         file: req.file
//     })
// })router.get("/edit",(req, res)=> {res.send("修改导航")
})router.post("/doEdit",(req, res)=> {res.send("执行修改导航")
})module.exports = router

四、实现多文件上传

在这里插入图片描述
在这里插入图片描述
add.html:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><form action="/admin/user/doAdd" method="POST" enctype="multipart/form-data">标题:<input type="text" name="title" id="title"><br><br>图片1<input type="file" name="pic1" id="pic1"><br><br>图片2<input type="file" name="pic2" id="pic2"><br><br>描述:<textarea name="desc" id="desc" cols="30" rows="10"></textarea><br><br><input type="submit" value="提交"></form></body>
</html>

user.js :

const express = require("express")
const tool = require('../../model/tool')var router = express.Router()router.get("/",(req, res)=> {res.send("用户列表")
})router.get("/add",(req, res)=> {res.render("admin/user/add.html")
})let cpUpload = tool.multer().fields([{ name: 'pic1', maxCount: 1 }, { name: 'pic2', maxCount: 1 }])router.post("/doAdd", cpUpload, (req, res)=> {res.send({body: req.body,files: req.files})
})router.post("/doEdit",(req, res)=> {res.send("执行修改用户")
})router.get("/edit",(req, res)=> {res.send("修改用户")
})module.exports = router

tool.js:

var multer = require('multer')
const path = require('path')
const sd = require('silly-datetime')
const mkdirp = require('mkdirp')let tools = {multer() {// var upload = multer({ dest: 'static/upload' }) // 上传文件之前目录必须存在var storage = multer.diskStorage({// 配置上传的文件保存的目录destination: async function (req, file, cb) {// 1.获取当前日期 20210417let day = sd.format(new Date(), 'YYYYMMDD')let dir = path.join('static/upload', day)// 2.按照日期生成图片存储目录await mkdirp(dir) // mkdirp()是一个异步方法cb(null, dir)},// 修改上传的文件的文件名filename: function (req, file, cb) {// 1.获取后缀名let extname = path.extname(file.originalname)// 2.根据时间戳生成文件名cb(null, Date.now() + "." + extname)}})var upload = multer({ storage: storage })return upload}
}module.exports = tools

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/470698.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ad19pcb设置恢复默认_条码打印机-斑马产品常用恢复出厂设置

当我们手上拿到条码打印机&#xff0c;遇到一下无法挽回的时候&#xff0c;我们可以选择恢复下出厂设置&#xff0c;这样使打印机还原到出厂&#xff0c;或许是很好的选择&#xff0c;接下来我们看下斑马条码打印机操作方法如下&#xff1a;Zebra 条码打印机恢复出厂1、有面板的…

Chapter1-5_Speech_Recognition(Alignment of HMM, CTC and RNN-T)

文章目录1 为什么需要Alignment2 穷举所有的alignment2.1 HMM的对齐2.2 CTC的对齐2.3 RNN-T的对齐3 小结本文为李弘毅老师【Speech Recognition - Alignment of HMM, CTC and RNN-T (optional)】的课程笔记&#xff0c;课程视频youtube地址&#xff0c;点这里&#x1f448;(需翻…

mongoose 入门以及 mongoose 实现数据 的增、删、改、查

一、mongoose 介绍 Mongoose 是在 node.js 异步环境下对 mongodb 进行便捷操作的对象模型工具。Mongoose 是 NodeJS 的驱动&#xff0c;不能作为其他语言的驱动。 Mongoose 有两个特点 &#xff1a; 1、通过关系型数据库的思想来设计非关系型数据库 2、基于 mongodb 驱动&…

64位处理器_电脑操作系统的32位和64位有什么区别

想买个新电脑&#xff0c;不知道买 64 位还是 32 位&#xff1f;买了一套视频剪辑软件&#xff0c;发现电脑根本安装不了&#xff1f;这些到底是为什么&#xff1f;对于 Windows7 及以上版本&#xff0c;我们能够很明显知道自己电脑操作系统是 64 位还是 32 位。如果你还不知道…

Chapter1-6_Speech_Recognition(RNN-T Training)

文章目录1 一个alignment概率的计算2 所有alignments概率的计算3 Training4 Inference5 小结本文为李弘毅老师【Speech Recognition - RNN-T Training (optional)】的课程笔记&#xff0c;课程视频youtube地址&#xff0c;点这里&#x1f448;(需翻墙)。 下文中用到的图片均来…

Mongoose 预定义模式修饰符 Getters 与 Setters 自定义修饰符

一、mongoose 预定义模式修饰符 lowercase、uppercase 、trim mongoose 提供的预定义模式修饰符&#xff0c;可以对我们增加的数据进行一些格式化。 var UserSchemamongoose.Schema({ name:{ type:String, trim:true }, age:Number, status:{ type:Number, default:1 } })二…

微信可以远程控制电脑吗_用微信就能远程控制电脑,这款神器有些厉害

「本期内容标签」安卓 iOS 电脑 小程序 网站 游戏 教程微信确实一步步改变生活&#xff0c;尤其是微信小程序面世以来&#xff0c;可谓是神器一个接一个的出现&#xff0c;很多功能已经和手机app旗鼓相当了。那么&#xff0c;今天说的这款刚推出的微信小程序&#xff0c;实现远…

开源的excel读取库libxls在windows下的编译,且支持中文,全网首发

转载请注明出处&#xff1a;http://www.cnblogs.com/superbi/p/5482516.html 到目前为止&#xff0c;网络和官网上并没有关于libxls在windows下支持中文的教程&#xff0c;也没有现成的二进制文件。 想直接得到结果的请直接拉到最后获取成果&#xff0c;想自己以后遇到类似问题…

Chapter1-7_Speech_Recognition(Language Modeling)

文章目录1 为什么需要Language Model2 N-gram3 Continuous LM3 NN-based LM4 RNN-based LM5 合并LAS和LM5.1 shallow fusion5.2 deep fusion5.3 cold fusion本文为李弘毅老师【Speech Recognition - Language Modeling】的课程笔记&#xff0c;课程视频youtube地址&#xff0c;…

Mongoose 索引、Mongoose 内置 CURD 方 法、扩展 Mongoose Model 的静态方法和 实例方法

一、Mongoose 索引 索引是对数据库表中一列或多列的值进行排序的一种结构&#xff0c;可以让我们查询数据库变得更 快。MongoDB 的索引几乎与传统的关系型数据库一模一样&#xff0c;这其中也包括一些基本的查询 优化技巧。 mongoose 中除了以前创建索引的方式&#xff0c;我们…

winre drv分区干嘛用的_都2020年了,还在给硬盘分区?看完你就知道有没有必要了...

电脑硬盘&#xff0c;到底该不该分区&#xff1f;很多人买了新电脑或者在电脑中安装了SSD硬盘之后&#xff0c;第一个步骤就是&#xff1a;开机-给硬盘分区。但是&#xff0c;大家有没有考虑过&#xff0c;硬盘是否真的需要分区呢&#xff1f;这不最近有人就在程序员社区V2EX上…

php 系列

1.给 跑在windows 环境下的php&#xff0c; 安装redis 拓展。&#xff08;installing Redis & Redis extension in PHP on XAMPP on windows.&#xff09; step 1: 安装redis server&#xff08;windows&#xff09; http://fellowtuts.com/php/install-redis-redis-extens…

搞懂RNN

文章目录1 什么是RNN2 LSTM3 Training3.1 Learning Target3.2 为什么难train4 应用举例4.1 Many To One4.2 Many To Many4.3 其他本文为李弘毅老师【Recurrent Neural Network(Part I)】和【Recurrent Neural Network(Part II)】的课程笔记&#xff0c;课程视频来源于youtube(需…

bp神经网络预测_股指期货价格变动趋势往往反映的是股票价格的走势,因此BP神经网络对股指期货价格的准确预测就是对股票价格的准确预测。...

一只猫の生活态度对于投资者而言&#xff0c;利用BP神经网络模型对股指期货价格进行准确预测&#xff0c;可以帮助投资者构建较佳的投资组合&#xff0c;从而获取较好的投资收益&#xff0c;规避系统风险&#xff1b;对于国家而言&#xff0c;准确预测股指期货价格走势&#xf…

Mongoose aggregate 多表关联查询

1. 查询每个order订单中的所有orderItem&#xff08;多表关联查询&#xff09; order.js: var mongoose require(./db.js)var OrderSchema mongoose.Schema({order_id: String,uid: Number,trade_no: String,all_price: Number,all_num: Number })var OrderModel mongoose…

搞懂Transformer

文章目录1 内容简述2 seq2seq的常用模块3 Self-attention4 Multi-head Self-attention5 Positional Encoding6 Transformer参考资料文为李弘毅老师【Transformer】的课程笔记&#xff0c;课程视频youtube地址&#xff0c;点这里&#x1f448;(需翻墙)。 下文中用到的图片均来自…

excel计算二元线性回归_怎么看懂Excel线性回归参数

虽然之前用python做线性回归的时候看上去好像很简单&#xff0c;但是直到我在excel上实践了线性回归&#xff0c;发现有很多指标值得去参考&#xff0c;对于在python上实现有指导作用。打开excel2016&#xff0c;先找个数据我们这里直接选择做线性回归&#xff0c;在菜单栏选择…

冲刺阶段 day 6

项目进展&#xff1a;学生管理这部分已经进展的差不多了&#xff0c;调试了几遍,改了几个小Bug之后就没有什么问题了,基本完成&#xff0c;如若后续还有一些新的功能到时候再自行加入。明天开始教师部分。 存在问题&#xff1a;我觉得我们的项目还是比较课堂&#xff0c;比较中…

Chapter2-1_Voice Conversion(Feature Disentangle)

文章目录1 什么是Voice Conversion2 实际实现中的细节3 根据数据集分类4 Feature disentangle5 训练技巧本文为李弘毅老师【Voice Conversion - Feature Disentangle】的课程笔记&#xff0c;课程视频youtube地址&#xff0c;点这里&#x1f448;(需翻墙)。 下文中用到的图片均…

1 0.99999的悖论_无限小数与芝诺悖论

问题昨天晚上&#xff0c;小学6年级的外甥女从数学课外辅导班补习回来&#xff0c;兴冲冲的对家里人说&#xff0c;哎&#xff0c;我发现了一个数学的大bug啊。你说1/3不是一个无限循环小数0.33333...&#xff0c;那么三个1/3加起来&#xff0c;不就是0.99999...吗&#xff1f;…