繁体   English   中英

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

[英]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(specific file) 。 人们还建议使用中间件来检查用户是否经过身份验证。

我的问题是,对于照片,我设置了照片路由和 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 那是一条红鲱鱼。

如果您只想允许经过身份验证的用户查看任何内容,请添加中间件以检查他们是否在提供任何内容的路由上经过身份验证。

路由如何提供任何东西都没有关系,只是您在做之前对用户进行身份验证。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM