- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个使用node.js、express和multer上传文件的系统,这些文件存储在静态目录中。我想要的是将它们存储在服务器上,并且只有在我登录后才能看到它们。
问题:
我的上传系统很好,但我需要保护目录/files/documents/hv.pdf 中的文件,因为每当我输入打开文件的网址时,浏览器都会保存历史记录,这是不应该发生的事情,如果用户尚未登录,我如何避免访问?
我正在尝试使用一个中间件,如果网址的字符串带有/files 文件夹的名称,则有趣的是,如果我不输入文件名或输入其他名称(例如/files/document/test.txt),它可以工作,但不能。当我访问静态文件夹中的链接时,我以为它是缓存,但绝对不是那样
这个中间件
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!');
}
}
获取根路径和 protected 路由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");
}
});
}
}
最佳答案
在深入讨论细节之前,需要记住的一件事是 Express.js 框架中的一切都被视为一个中间件。因此,您的代码顺序很重要(即您的 app.use
如何按顺序连接)。每次客户端访问您的应用程序时,都会从 app.js
文件的顶部开始,直到可以返回某些内容为止。
首先,静态路由意味着通过给定路径(文件夹)传递的内容是静态的。通常,在 app.js
文件的顶部头部有:
app.use(express.static('./public', options));
在上面的代码中,文件夹“public”被设置为静态。也就是说,放入此文件夹中的任何内容(包括放入其子文件夹中的文档)对公众都是完全透明的,因此您无需指定放入此文件夹中的内容。当客户端尝试向服务器发出 HTTP 请求时,Express 将扫描文件夹并在找到请求的文件后返回文档;如果没有,那么它将通过您的下一个 app.use
。
并且您可以分配多个静态路由。例如,如果您现在在上述代码之后附加以下代码:
app.use(express.static('./file', options));
在“./public”路径中找不到任何内容后,您的服务器现在将扫描以“file”命名的文件夹,并尝试查找所请求的文档。基本上,做与上面相同的事情。
以下是您可以通过将上面的代码替换为以下内容来玩的技巧:
app.use('/file', checkIfTheUserHaveLogIn);
app.use('/file', express.static('./file', options));
或一行:
app.use('/file', checkIfTheUserHaveLogIn, express.static('./file', options));
在这里,我使用 '/file'
作为 app.use
中的第一个参数来指定 URL 中必须匹配的特殊路径。注意,checkIfTheUserHaveLogIn
是一个中间件函数,它作为 Controller (函数)来决定是否允许客户端访问下一级中间件(通过调用next()
),即express.static('./file', options)
。如果客户端尚未被授予该权限,您可以将客户端重定向到登录页面或在 checkIfTheUserHaveLogIn
中执行其他操作。
在您的代码中,您设置一个路由器来屏蔽“/file”路由路径来执行身份验证。但是,因为中间件的顺序很重要。其实就是先触发静态路由器,找到文件,这样文件就已经返回给请求的客户端了。您的中间件实际上从未被访问过。为了避免这种情况,只需按照我之前所做的操作,设置另一个静态路由并指向另一个文件夹(不得是第一个透明静态路由器下的子文件夹,即不在我的示例中的 ./public
下)。那么它应该可以完美地工作。
希望我的解释能澄清您的问题。
关于node.js - 上传文件并请求 protected 下载node.js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49993826/
我有以下正则表达式 /[a-zA-Z0-9_-]/ 当字符串只包含从 a 到z 大小写、数字、_ 和 -。 我的代码有什么问题? 能否请您向我提供一个简短的解释和有关如何修复它的代码示例? //var
我是一名优秀的程序员,十分优秀!