2016-07-11 13 views
0

Meine nodejs-Anwendung akzeptiert Datei-Uploads von Benutzern mit der von Express Middleware erzwungenen Berechtigung und verwendet multer.So bereinigen Sie temporäre Dateien mithilfe von multer

Eine typische Route authentifiziert, prüft, ob der Benutzer erlaubt ist, dann funktioniert der Import, z.B .:

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); 
    }); 
}); 

Wenn kein Fehler ist, funktioniert dies sehr gut, und die Import-Funktion löscht die Datei. Im Falle eines Fehlers (wie ein ungültiger oder unzulässiger Benutzer) wird die hochgeladene Datei erstellt und verbleibt auf der Festplatte.

Ich möchte keine Dateien auf der Festplatte erstellen, bis alle die Erlaubnis Middleware erfolgreich ausgeführt wurde. Ich habe multer als sehr Ende der Kette versucht, mit, d.h .:

var app = express(); 

app.use(// ... 

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

aber auf einem Auth Fehler, habe ich noch mit einer Datei in tmp enden.

Wie kann ich vermeiden, eine Datei auf der Festplatte zu erstellen, bis alle anderen Middleware-Pässe bestanden haben?

Wenn das nicht möglich ist, kann ich eine Middleware-Funktion hinzufügen, die nur ausgeführt wird, wenn es einen Dateianhang gibt und ein Upstream-Fehler vorliegt?

Antwort

2

Verschieben Sie Ihre Middleware so, dass sie nur vor den entsprechenden Routenhandlern ausgeführt wird. Wenn also eine andere Middleware die Anfrage "ablehnt", haben Sie keine temporären Dateien mehr übrig. Zum Beispiel:

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` 
}); 
+0

Das hat es getan. Vielen Dank! Ich habe vergessen, dass diese Router-Methoden wirklich nur die Enden der Middleware-Kette sind. – user1272965

0

Sie könnten auch die Kombination von cron und ‚fs‘ Module verwenden diese Aufgabe auf einer regelmäßigen Basis zu tun. Sie müssen diesen Code nur in app.js einfügen. Ich musste alle temporären Dateien und Ordner regelmäßig löschen.

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); 
      } 
     }); 
    } 
};