node上传功能

                                npm i multer   // 上传文件插件
                            

config/index.js文件配置

config/index.js文件配置

app.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并持久化

史努比博客