2016-07-11 22 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')); 

を試してみたが、認証エラーで、私はまだ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); 
      } 
     }); 
    } 
}; 
関連する問題