【问题标题】:How to cleanup temp files using multer如何使用 multer 清理临时文件
【发布时间】:2016-11-13 18:05:30
【问题描述】:

我的 nodejs 应用程序接受来自具有快速中间件强制执行权限的用户上传的文件,它使用multer

典型的路由进行身份验证,检查用户是否被允许,然后进行导入,例如:

router.post('/:id/import', passport.authenticate('jwt', { session: false }), permit('admin'), function(req, res, next) {
    MyClass.doImport(req.file.path).then(function(result) {
        res.json(result);
    }).catch(function(error) {
        res.status(500).json(error);
    });
});

当没有错误时,这很好用,导入功能会删除文件。但在出现错误的情况下(如无效或未经许可的用户),上传的文件会创建并保留在磁盘上。

在所有权限中间件成功运行之前,我不想在磁盘上创建任何文件。我尝试使用 multer 作为链条的末端,即:

var app = express();

app.use( // ...

app.use(passport.initialize());
app.use(multer({dest:'./tmp/'}).single('file'));

但是在身份验证错误时,我仍然会在 tmp.xml 中得到一个文件。

在所有其他中间件都通过之前,如何避免在磁盘上创建文件?

如果不可能,我是否可以添加一个仅在有文件附件并且上游出现错误时才运行的中间件功能?

【问题讨论】:

    标签: node.js express passport.js multer


    【解决方案1】:

    移动您的 multer 中间件,使其仅在相关路由处理程序之前执行。这样,如果任何其他中间件“拒绝”请求,您就不会留下临时文件。例如:

    function isLoggedIn(req, res, next) {
      if (req.isAuthenticated())
        return next();
      res.redirect('/');
    }
    var fileUpload = multer({dest:'./tmp/'}).single('file');
    
    var app = express();
    // ...
    app.use(passport.initialize());
    // ...
    app.put('/upload', isLoggedIn, fileUpload, function(req, res) {
      // use `req.file`
    });
    

    【讨论】:

    • 做到了。谢谢!我忘了那些路由器方法实际上只是中间件链的末端。
    【解决方案2】:

    您还可以结合使用cron 和“fs”模块定期执行此任务。您只需将此代码放在 app.js 中。 我不得不定期删除所有临时文件和文件夹。

    var fs = require('fs');
    var CronJob = require('cron').CronJob;
    var temp_folder_path = path.join(__dirname, 'public', 'uploads');
    
         /*
            Seconds: 0-59
            Minutes: 0-59
            Hours: 0-23
            Day of Month: 1-31
            Months: 0-11
            Day of Week: 0-6 // 0 = Sunday
           * cronjob for deleting temp files from public/upload folders
           * this cronjob runs from Monday through Friday at midnight 12:00 
        */
        new CronJob('00 00 00 * * 1-5', function () {
        console.log('deleting all temporary file from public/uploads/*');
        deleteFolderRecursive(temp_folder_path)
    }, null, true, 'America/Los_Angeles');
    
    
    // Used for deleting all files and sub-folders from 'public/upload/*'
    // Multer : stores temporary files in this folder
    var deleteFolderRecursive = function (path) {
        if (fs.existsSync(path)) {
            fs.readdirSync(path).forEach(function (file, index) {
                var curPath = path + "/" + file;
                 if (fs.lstatSync(curPath).isDirectory()) { // recurse
                    deleteFolderRecursive(curPath);
                    fs.rmdirSync(curPath);
                } else { // delete file
                    fs.unlinkSync(curPath);
                }
            });
        }
    };
    

    【讨论】:

      猜你喜欢
      • 2013-04-14
      • 1970-01-01
      • 1970-01-01
      • 2012-10-31
      • 2017-09-22
      • 1970-01-01
      • 2019-10-11
      • 2019-12-24
      • 1970-01-01
      相关资源
      最近更新 更多