首页 > 解决方案 > NodeJS / Multer:如何用新文件替换目录中的现有文件

问题描述

我想在上传新文件时替换目录中的现有文件,我正在使用nodeJS和multer,想法是读取目录内容,删除它然后上传新文件。

const express = require('express')
const router = express.Router()
const authorize = require('_middleware/authorize')
const Role = require('_helpers/role')
const uploadImage = require("./uploadAdvertising")
const fs = require('fs')
const uploadDir = '/public/advertising/'

// routes
router.post('/', authorize(Role.Admin), uploadImage, createAdvertising);

module.exports = router;

async function createAdvertising(req, res, next) {
    fs.readdir(global.__basedir + uploadDir, ((err, files) => {
        if (err) throw err
        for (const file of files){
            fs.unlink(global.__basedir + uploadDir + file, err => {
                if (err) throw err;
            });
        }
    }))
    if (!req.file) return res.status(412).send({
        message: `image is required`,
    });
    uploadImage(req, res)
        .then(data => {

            return res.status(201).send({
                message: 'Advertising image saved'
            })
        }).catch(err => {
        return res.status(500).send({
            message: `Could not upload the file, ${err}`,
        });
    })
}

穆尔特

const util = require("util");
const multer = require("multer");
const maxSize = 10 * 1024 * 1024;
const uploadDir = '/public/advertising/'
const fs = require('fs')
let storage = multer.diskStorage({
    destination: (req, file, cb) => {
        cb(null, global.__basedir + uploadDir)
        req.uploadDirectory = global.__basedir + uploadDir
    },
    filename: (req, file, cb) => {
        cb(null, file.originalname)
    },
});

let uploadImage = multer({
    storage: storage,
    fileFilter: (req, file, cb) => {
        //reject
        if (file.mimetype === 'image/jpeg' || file.mimetype === 'image/png') {
            cb(null, true)
        } else {
            cb(new Error("image should be png or jpeg extension"), false)
        }
    },
    limits: {fileSize: maxSize},
}).single("imageAdvertising");

let uploadFileMiddleware = util.promisify(uploadImage);
module.exports = uploadFileMiddleware;

有人可以看看并告诉这段代码有什么问题!它会删除所有内容,甚至是新上传的文件!

标签: node.jsfiledirectoryuploadmulter

解决方案


只需在 multer 文件中尝试这样

注意:将上传文件的路径写入unlinkSyncreaddirSync

fileFilter: (req, file, cb) => {
    let files = fs.readdirSync('write the path');
    if(files.includes(file.originalname)){
        fs.unlinkSync('pwrite the pathath'+ file.originalname);
    }
    if (file.mimetype === 'image/jpeg' || file.mimetype === 'image/png') {
        cb(null, true)
    } else {
        cb(new Error("image should be png or jpeg extension"), false)
    }
}

并删除像createAdvertising文件这样的额外代码


推荐阅读