首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在使用res.sendFile中发送的文件的res.rendering中使用Express.js?

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

Stack Overflow用户
提问于 2022-05-11 20:01:35
回答 1查看 65关注 0票数 0

我正在尝试创建一个使用node.js和Express的文件服务器。我目前设置了系统,以便每个用户都有一个文件目录。我现在已经设置了它,这样整个文件系统就可以使用

代码语言:javascript
运行
复制
app.use(express.static(testFolder));

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

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

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

以下是该路线的代码:

代码语言:javascript
运行
复制
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 });  
})
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-11 20:08:09

忘了用sendFile代替sendFile吧。那是一条红鲱鱼。

如果只允许经过身份验证的用户看到任何内容,那么添加中间件来检查他们是否在服务于任何内容的路由上进行身份验证。

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

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

代码语言:javascript
运行
复制
router.post(
    "/view/photo",
    authenticationMiddleware,
    photoPostingEndpointFunction
);

router.use(
    "/photos",
    authenticationMiddleware,
    express.static('path/to/protected/photos)
);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72206993

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档