res.sendFile while res.rendering 和 HTML 如何使用 Express.js 中发送的文件?

How to res.sendFile whilst res.rendering an HTML that uses the sent file in Express.js?

我正在尝试创建一个使用 node.js 和 Express 的文件服务器。我当前设置了系统,以便每个用户都有一个文件目录。我目前已将其设置为使用

托管整个文件系统
app.use(express.static(testFolder));

这种方法的问题是任何人都可以查看任何人的文件,即使他们没有登录。我已经看过,其他人建议不要托管整个文件系统并使用 res.sendFile(特定文件)反而。人们还建议使用中间件来检查用户是否已通过身份验证。

我的问题是,比如说照片,我设置了照片路径和 EJS 文件,这样对于所有照片,要查看的照片都在 .ejs 文件中呈现。

我如何 res.sendFile() 然后将其呈现在 .ejs 文件中?因为只是 res.sendFile() 只显示带有白色背景且没有自定义的照片。

这是路线的代码:

router.post("/view/photo", function(req, res){
    var path = req.body.currentPath
    var filename = req.body.fileName
    var currentUser = req.body.currentUser
   
    var files = fs.readdirSync(path)
    var images = []
    var fileExtensions = ['jpg', 'jpeg', 'gif', 'png']

    for(var i = 0; i < files.length; i++){
        fileExtension = files[i].split(".")[1]
        if(fileExtension){
            if(fileExtensions.includes(fileExtension.toLowerCase())){
                images.push(files[i])
            }
        }
    }
 
    var indexOfFile = images.indexOf(filename)
    var next = indexOfFile + 1;
    var previous = indexOfFile - 1;

    if(next > images.length - 1){
        next = next - (images.length)
    }
    if(previous < 0){
        previous = previous + (images.length)
    }

    path = path.split("/")
    path = path.splice(path.indexOf(currentUser, 0), path.length)
    path = path.join("/")
    finalPath = "../" + path + "/" + filename
    
    var nextFileName = images[next]
    var prevFileName = images[previous]

    res.sendFile(req.body.currentPath + "/" + filename);

    // res.render("showPhoto.ejs", {photoPath: finalPath, filename: filename, currentPath: req.body.currentPath, next: nextFileName, prev:prevFileName });  
})

忘记用 sendFile 替换 express.static。那是一条红鲱鱼。

如果你想只允许经过身份验证的用户看到 任何东西,那么添加中间件来检查他们是否在提供 [=24] 服务的路由上经过身份验证=]任何东西都是。

如何路由提供任何东西并不重要,只是在执行之前对用户进行身份验证。

如果路由使用static提供图片文件,那么在它之前添加一些身份验证中间件。如果路由使用render生成一个HTML文档,其中包含一个<img>指向前面提到的静态路由,那么在它之前添加一些认证中间件。等等

router.post(
    "/view/photo",
    authenticationMiddleware,
    photoPostingEndpointFunction
);

router.use(
    "/photos",
    authenticationMiddleware,
    express.static('path/to/protected/photos)
);