我正在尝试创建一个使用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 });
})
发布于 2022-05-11 20:08:09
忘了用sendFile
代替sendFile
吧。那是一条红鲱鱼。
如果只允许经过身份验证的用户看到任何内容,那么添加中间件来检查他们是否在服务于任何内容的路由上进行身份验证。
路由如何为任何内容提供服务并不重要,只是在执行之前对用户进行身份验证。
如果路由使用static
来提供图像文件,那么在它之前添加一些身份验证中间件。如果路由使用render
生成HTML,其中包含指向前面提到的静态路由的<img>
,那么在它之前添加一些身份验证中间件。等。
router.post(
"/view/photo",
authenticationMiddleware,
photoPostingEndpointFunction
);
router.use(
"/photos",
authenticationMiddleware,
express.static('path/to/protected/photos)
);
https://stackoverflow.com/questions/72206993
复制相似问题