node上传功能
npm i multer // 上传文件插件
config/index.js文件配置
app.js配置
路由配置
逻辑控制器文件配置
const upload = require("../utils/upload");
exports.blogUploadAPI = async (req, res, next) => {
upload(req, res).then(imgSrc => {
res.send(imgSrc)
}).catch(err => {
res.send(err)
})
}
上传函数文件
const multer = require('multer'); // 上传插件
const config = require('../config'); //图片路径配置
const fs = require('fs');
const path = require('path');
const {setFileName, generateThreeDigitNumber} = require("./index"); //工具函数 setFileName 生成日期时间 generateThreeDigitNumber 随机3位数字
// 自动创建文件夹
let createDir = (path) => {
if (!fs.existsSync(path)) {
fs.mkdirSync(path);
}
}
let uploadFolder = 'public/uploads/'
createDir(uploadFolder)
// 设置文件引擎
let storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, uploadFolder)
},
filename: function (req, file, cb) {
const extension = path.extname(file.originalname);//提取文件后缀
const newFilename = `${setFileName()}-${generateThreeDigitNumber()}${extension}`; // 自定义文件名
cb(null, newFilename)
}
})
// 文件过滤函数
const fileFilter = (req, file, cb) => {
const allowedTypes = ['image/jpeg', 'image/png', 'image/gif', 'video/mp4'];
if (!allowedTypes.includes(file.mimetype)) {
const error = new Error('文件格式错误');
error.message = '文件格式错误';
return cb(error, false);
}
cb(null, true);
};
// 初始化配置上传中间件
const multerConfig = multer({
storage,
fileFilter,
limits: {fileSize: 50 * 1024 * 1024} // 限制单文件最大50MB
})
// 上传的 fileName 名称
const fileName = "file"
// 上传到服务器地址
const updateBaseUrl = config.app.imgSrc
const imgPath = "uploads/" // 上传到服务器的虚拟目录
function upload(req, res) {
return new Promise((resolve, reject) => {
multerConfig.single(fileName)(req, res, function (err) {
if (err) {
if (err instanceof multer.MulterError) {
reject('文件大小超出限制')
} else if (err.message === '文件格式错误') {
reject('文件格式错误')
}
} else {
// `req.file.filename` 请求文件名称后缀
resolve(updateBaseUrl + imgPath + req.file.filename)
}
});
})
}
module.exports = upload;
const setFileName = () => {
const now = new Date();
const year = now.getFullYear();
const month = String(now.getMonth() + 1).padStart(2, '0'); // 月份从0开始,需要加1
const day = String(now.getDate()).padStart(2, '0');
const hours = String(now.getHours()).padStart(2, '0');
const minutes = String(now.getMinutes()).padStart(2, '0');
const seconds = String(now.getSeconds()).padStart(2, '0');
return `${year}-${month}-${day}_${hours}-${minutes}-${seconds}`;
}
const generateThreeDigitNumber = () => {
return Math.floor(Math.random() * 900) + 100;
}
上一篇
如何在Bing上提交网址
下一篇
Nuxt3中使用pinia并持久化