2016-04-11 16 views
2

アップロードされた画像を保護したいと思います。ユーザーが画像をアップロードする場合、それらは次のパスに保存されます。Node.jsでプライベート静的ファイルを正しく処理する方法は?

public/dogs/{userId}/{imageName} 

各ユーザーは、それが画像が保存されている独自のディレクトリのしています。私はこのような何かを行う場合、私は簡単にこれらの画像を提供することができます考え出したが、画像は、誰もがアクセス可能な:

app.use(express.static('public')); 

私のユーザーの検証は、私がチェック方法で機能要求URLは/api/admin中に含まれていませんパス。例:

router.get('/api/admin/dogs', dog.getAll); 

私は同様の方法で管理者がアクセスできるように画像を提供したいと思います。

router.get('/api/admin/dogs/images/:userId/:imageName', image.getOne); 

ご協力いただきありがとうございます。

答えて

1

responseオブジェクトにはsendFile機能があります。これを使用して、ユーザー検証に基づいてファイルを送信することができます。

それはこのようなものになるだろう:

router.get('/api/admin/dogs/images/:userId/:imageName', function(req, res, next){ 
    currentUserHasAccessTo(userId, imageName, function(err) { 
    if (err) 
     next(err) 
    else 
     res.sendFile(`public/dogs/${userId}/${imageName}`) 
    }) 
}); 

currentUserHasAccessToは、データベースまたは他の何かを照会でしょう、あなたの検証機能です。 エラーが返された場合、エラーハンドラミドルウェアに渡され、デフォルトイメージまたはエラーページが表示されます。

0

あなたはまた、ハンドラのスタック使用することができます。この場合

router.get('/api/admin/dogs/images/:userId/:imageName', function(req, res, next){ 
    currentUserHasAccessTo(userId, imageName, function(err) { 
    if (err) 
    next(err); // or res.send(401) if unauthorized 
    else 
    res.next() ; // this will "jump" to the express.static below 
    }) 
, express.static('public') }); 

を、あなたは、単一のルートの2件のハンドラがあります。 2番目のメソッドは、next()が呼び出されたときにのみ呼び出されます。

関連する問題