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)
);
我正在尝试创建一个使用 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)
);