node.js - 上传前在 Multer 中验证

标签 node.js express mongoose multer

在使用 Multer 上传文件之前,我尝试验证收到的 idProject 是否为 ObjectId 或者它是否存在于我的数据库中。但它会保存文件然后进行验证。

我尝试将其放入 app.post('/file', ()=>) 之类的索引中,它可以工作,但我想将其保留在 .controller.js 和 .route.js 中

  • index.js

const storage = multer.diskStorage({
    destination: path.resolve('./uploads'),
    filename: (req, file, cb, filename) => {
        cb(null, uuid() + path.extname(file.originalname));
    }
});
app.use(multer({storage: storage}).single('file'));

  • project.controller.js

projectCtrl.addFileToProject = async (req, res) => {
    const { id } = req.params;
    await Project.findById(id)
        .then((project) => {
            if(project === null){
                res.json({
                    status: 'Fail to Add File 1'
                });
            }
            else{
                fileCtrl.uploadFile(req, async (cb) => {
                    await Project.findByIdAndUpdate(id, {$addToSet: {files: cb}})
                });
                res.json({
                    status: 'File Added to Project'
                });
            }
        })
        .catch(() => {
            res.json({
                status: 'Fail to Add File 2'
            });
        });
};

  • 文件.controller.js
    fileCtrl.uploadFile = async (data, cb) => {
    var now = moment();
    const { size } = data.file;
    const { mimetype } = data.file;
    var icon;
    if (mimetype === mime.lookup('.pdf')) {
        icon = 'pdfIcon';
    }
    else if (mimetype === mime.lookup('.doc')) {
        icon = 'docIcon';
    }
    else if (mimetype === mime.lookup('.docx')) {
        icon = 'docIcon';
    }
    else if (mimetype === mime.lookup('.xls')) {
        icon = 'xlsIcon';
    }
    else if (mimetype === mime.lookup('.xlsx')) {
        icon = 'xlsIcon';
    }
    else if (mimetype === mime.lookup('.ppt')) {
        icon = 'pptIcon';
    }
    else if (mimetype === mime.lookup('.pptx')) {
        icon = 'pptIcon';
    }
    else if (mimetype === mime.lookup('.jpg')) {
        icon = 'jpgIcon';
    }
    else if (mimetype === mime.lookup('.png')) {
        icon = 'pngIcon';
    }
    else if (mimetype === mime.lookup('.txt')) {
        icon = 'txtIcon';
    }
    else if (mimetype === mime.lookup('.zip')) {
        icon = 'zipIcon';
    }
    else {
        icon = 'fileIcon';
    }
    var decimals=2;
    if(size == 0) return '0 Bytes';
    var k = 1024,
    dm = decimals <= 0 ? 0 : decimals || 2,
    sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
    i = Math.floor(Math.log(size) / Math.log(k));
    var fileSize = parseFloat((size / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
    const file = new File();
    file.filename = data.file.filename;
    file.author = data.body.author;
    file.path = '/uploads/' + data.file.filename;
    file.originalname = data.file.originalname;
    file.icon = icon;
    file.size = fileSize;
    file.created_at = now;
    await file.save();
    cb(file._id);
    };

最佳答案

使用 multer,您无法真正动态控制上传。 但是,您可以做的是将其上传到临时文件夹中,然后检查 id 是否存在。如果您的数据库中存在该文件,您可以将该文件移动到另一个文件夹中,否则,删除该文件

关于node.js - 上传前在 Multer 中验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54622971/

相关文章:

node.js - 使用 Mongoose 模式验证密码/确认密码

node.js - 过期的 session ID 是否使用 Express-Session 进行回收

Mongodb聚合查找在每个数组中添加有条件的字段

javascript - 尝试将 haml-coffee 与expressJS 应用程序一起使用时出现奇怪的错误

node.js - 长时间运行的 Node.js 进程在运行几天后会变慢

javascript - AWS SDK 文件通过 Node/Express 使用流 PassThrough 上传到 S3 - 文件总是损坏

node.js - Mongoose 聚合 : limit the number of records in $group

javascript - Promise.map 未完成,因为后续 Promise.join 先完成?都答应吗?

node.js - 返回日期范围内的数组文档

javascript - 如何让 async.each 等待 .save() 完成?