上传文件并请求受保护的下载 node.js
upload files and request protected download node.js
我有一个系统可以使用 node.js、express 和 multer 上传文件,文件存储在静态目录中。我想要的是将它们存储在服务器上,并且只有在我登录后才能看到它们。
问题:
我的上传系统没问题,但我需要保护目录/files/documents/hv.pdf中的文件,因为每当我输入url文件打开时浏览器都会保存历史记录,有些东西这不应该发生,如果用户未登录,我如何避免访问?
我正在尝试使用一个中间件,如果 url 的字符串带有 / files 文件夹的名称,这很有趣,如果我不输入文件名或输入另一个名称,如 /files/document/test.txt 可以用但不行 当我访问静态文件夹中的 link 时,我以为它是缓存,但绝对不是
这个中间件
module.exports = (req,res,next)=>{
let regex = /^\/files\/.*$/;
if (!regex.test(req.url)) { return next(); }
// for test
req.session.user = {name:"thaylor"}; //comment for not session
//fin for test
if(req.session.user){
next();
}else{
res.end('You are not allowed!');
}
}
更新,此解决方案 2018-04-2017
用于获取根路径和受保护路由的中间件app.js
const protectedfile = require("./controllers/protectedfile");
app.use(function(req, res, next) {
req.rootPath = __dirname;
next();
});
app.use('/files', protectedfile);
app.use('/files', express.static(path.join(__dirname, 'files')) );
这个文件controllers/protectedfile.js
const path = require('path');
module.exports = (req,res,next)=>{
if(!req.session.user){
res.send("Route protected");
}else{
let file = path.join(req.rootPath, req.originalUrl);
res.download(file, function (err) {
if (err) {
console.log("Error");
console.log(err);
} else {
console.log("success");
}
});
}
}
感谢大家
var express = require("express");
var path = require( "path" );
var app = express();
app.use( '/upload', isLoggedIn, express.static( path.join( __dirname, '**your upload folder name**' ) ) );
app.listen( 3000 );
//Use this code if you are using passport.js for authentication mech.
function isLoggedIn(req, res, next) {
if (req.user) {
next();
} else {
res.redirect('/login');
}
}
//Use this code for custom sign in implementation
function isLoggedIn(req, res, next) {
//check if user is logged in
// your business logic goes here
if ( condition ) {
next();
} else {
res.redirect('/login');
}
}
每次调用 localhost:3000/upload/* 时都这样做,将通过 isLoggedIn 函数。
在深入探讨细节之前,要记住的一件事是 Express.js 框架中的所有内容 都被视为一个中间件。所以你的代码顺序很重要(即你的 app.use
是如何按顺序连接的)。每次客户端访问您的应用程序时,都会从 app.js
文件的顶部开始,直到可以 returned.
首先,静态路由意味着通过此给定路径(文件夹)传送的内容是静态的。通常,在 app.js
文件的顶部头部,有:
app.use(express.static('./public', options));
在上面的代码中,文件夹 'public' 被设置为静态。即任何放入此文件夹(包括放入其 子文件夹 的文档)对 public 完全透明,因此您无需指定已放入的内容到这个文件夹中。当客户端尝试向您的服务器发出 HTTP 请求时,一旦可以找到请求的文件,Express 将扫描整个文件夹和 return 文档;如果没有,那么它将通过你的下一个 app.use
.
并且您可以分配多个静态路由。例如,如果您现在在上面的代码之后附加以下代码:
app.use(express.static('./file', options));
您的服务器现在将扫描以 'file' 命名的文件夹 在 没有找到 './public' 路径后,并尝试找出要求的文件。基本上,做和上面一样的事情。
这里是你可以通过替换上面的代码来玩的把戏:
app.use('/file', checkIfTheUserHaveLogIn);
app.use('/file', express.static('./file', options));
或一行:
app.use('/file', checkIfTheUserHaveLogIn, express.static('./file', options));
这里,我使用'/file'
作为app.use
中的第一个参数来指定URL中必须匹配的特殊路径。注意,checkIfTheUserHaveLogIn
是一个中间件函数,作为控制器(函数)来决定是否允许客户端访问下一级中间件(通过调用 next()
),即 express.static('./file', options)
.如果客户端未被授予该权限,您可以将客户端重定向到登录页面或在 checkIfTheUserHaveLogIn
中执行其他操作。
在您的代码中,您设置了一个路由器来筛选出“/file”路由路径以执行您的身份验证。但是,因为中间件的顺序很重要。其实就是先触发static router,可以找到文件,这样文件就已经returned到请求的客户端了。您的中间件实际上从未被访问过。为了避免它,只需按照我之前所做的,设置另一个静态路由并指向另一个文件夹(不能是第一个透明静态路由器下的子文件夹,即不在我的示例中的 ./public
下)。那么它应该可以完美运行。
希望我的解释能澄清你的问题。
我有一个系统可以使用 node.js、express 和 multer 上传文件,文件存储在静态目录中。我想要的是将它们存储在服务器上,并且只有在我登录后才能看到它们。
问题:
我的上传系统没问题,但我需要保护目录/files/documents/hv.pdf中的文件,因为每当我输入url文件打开时浏览器都会保存历史记录,有些东西这不应该发生,如果用户未登录,我如何避免访问?
我正在尝试使用一个中间件,如果 url 的字符串带有 / files 文件夹的名称,这很有趣,如果我不输入文件名或输入另一个名称,如 /files/document/test.txt 可以用但不行 当我访问静态文件夹中的 link 时,我以为它是缓存,但绝对不是
这个中间件
module.exports = (req,res,next)=>{
let regex = /^\/files\/.*$/;
if (!regex.test(req.url)) { return next(); }
// for test
req.session.user = {name:"thaylor"}; //comment for not session
//fin for test
if(req.session.user){
next();
}else{
res.end('You are not allowed!');
}
}
更新,此解决方案 2018-04-2017
用于获取根路径和受保护路由的中间件app.js
const protectedfile = require("./controllers/protectedfile");
app.use(function(req, res, next) {
req.rootPath = __dirname;
next();
});
app.use('/files', protectedfile);
app.use('/files', express.static(path.join(__dirname, 'files')) );
这个文件controllers/protectedfile.js
const path = require('path');
module.exports = (req,res,next)=>{
if(!req.session.user){
res.send("Route protected");
}else{
let file = path.join(req.rootPath, req.originalUrl);
res.download(file, function (err) {
if (err) {
console.log("Error");
console.log(err);
} else {
console.log("success");
}
});
}
}
感谢大家
var express = require("express");
var path = require( "path" );
var app = express();
app.use( '/upload', isLoggedIn, express.static( path.join( __dirname, '**your upload folder name**' ) ) );
app.listen( 3000 );
//Use this code if you are using passport.js for authentication mech.
function isLoggedIn(req, res, next) {
if (req.user) {
next();
} else {
res.redirect('/login');
}
}
//Use this code for custom sign in implementation
function isLoggedIn(req, res, next) {
//check if user is logged in
// your business logic goes here
if ( condition ) {
next();
} else {
res.redirect('/login');
}
}
每次调用 localhost:3000/upload/* 时都这样做,将通过 isLoggedIn 函数。
在深入探讨细节之前,要记住的一件事是 Express.js 框架中的所有内容 都被视为一个中间件。所以你的代码顺序很重要(即你的 app.use
是如何按顺序连接的)。每次客户端访问您的应用程序时,都会从 app.js
文件的顶部开始,直到可以 returned.
首先,静态路由意味着通过此给定路径(文件夹)传送的内容是静态的。通常,在 app.js
文件的顶部头部,有:
app.use(express.static('./public', options));
在上面的代码中,文件夹 'public' 被设置为静态。即任何放入此文件夹(包括放入其 子文件夹 的文档)对 public 完全透明,因此您无需指定已放入的内容到这个文件夹中。当客户端尝试向您的服务器发出 HTTP 请求时,一旦可以找到请求的文件,Express 将扫描整个文件夹和 return 文档;如果没有,那么它将通过你的下一个 app.use
.
并且您可以分配多个静态路由。例如,如果您现在在上面的代码之后附加以下代码:
app.use(express.static('./file', options));
您的服务器现在将扫描以 'file' 命名的文件夹 在 没有找到 './public' 路径后,并尝试找出要求的文件。基本上,做和上面一样的事情。
这里是你可以通过替换上面的代码来玩的把戏:
app.use('/file', checkIfTheUserHaveLogIn);
app.use('/file', express.static('./file', options));
或一行:
app.use('/file', checkIfTheUserHaveLogIn, express.static('./file', options));
这里,我使用'/file'
作为app.use
中的第一个参数来指定URL中必须匹配的特殊路径。注意,checkIfTheUserHaveLogIn
是一个中间件函数,作为控制器(函数)来决定是否允许客户端访问下一级中间件(通过调用 next()
),即 express.static('./file', options)
.如果客户端未被授予该权限,您可以将客户端重定向到登录页面或在 checkIfTheUserHaveLogIn
中执行其他操作。
在您的代码中,您设置了一个路由器来筛选出“/file”路由路径以执行您的身份验证。但是,因为中间件的顺序很重要。其实就是先触发static router,可以找到文件,这样文件就已经returned到请求的客户端了。您的中间件实际上从未被访问过。为了避免它,只需按照我之前所做的,设置另一个静态路由并指向另一个文件夹(不能是第一个透明静态路由器下的子文件夹,即不在我的示例中的 ./public
下)。那么它应该可以完美运行。
希望我的解释能澄清你的问题。