2016-07-11 3 views
0

Приложение nodejs принимает заказы файлов от пользователей с разрешением, которое принудительно реализуется с помощью промежуточного программного обеспечения, и использует multer.Как очистить временные файлы с помощью 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')); 

но на ошибку AUTH, я до сих пор в конечном итоге с файлом в TMP.

Как я могу избежать создания файла на диске до тех пор, пока не пройдет все другие промежуточное ПО?

Если это невозможно, могу ли добавить функцию промежуточного программного обеспечения, которая выполняется только в том случае, если есть вложение файла и есть ошибка вверх по течению?

ответ

2

Переместите ваше промежуточное программное обеспечение 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` 
}); 
+0

Это сделало. Благодаря! Я забыл, что эти методы маршрутизатора на самом деле являются лишь концами цепи промежуточного программного обеспечения. – user1272965

0

Вы также можете использовать комбинацию 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); 
      } 
     }); 
    } 
}; 

 Смежные вопросы

  • Нет связанных вопросов^_^