【问题标题】:How to serve static file and give its path to one user?如何提供静态文件并将其路径提供给一个用户?
【发布时间】:2017-06-02 06:58:18
【问题描述】:

我正在使用 jsmodeler (https://github.com/kovacsv/JSModeler) 在我的网站上显示 3d 模型。用户选择文件的唯一选项是通过文件选择器并将文件的路径放在 url 中(即http://localhost:3000/ModelView#https://cdn.rawgit.com/kovacsv/Online3DViewer/9e9ca71d/website/testfiles/cube.3ds)。我想通过我的节点 js 服务器发送一个文件,然后将文件加载到查看器中。

我想我需要将我提供的文件的路径放入 url 并刷新页面?但是我如何获得这条路径?它应该只对一个用户可用,所以我不能把它放在公用文件夹中!

说我用

发送
res.sendFile(myFile)

这不会发送文件的路径对吗?我也担心即使我得到了路径,当我在新的 url 刷新页面时,该文件将不再存在。

更新: 所以我想当模型保存在我的服务器上时,我会将它保存在公共文件夹中,但是在一个随机数下,即“path/1982746/model.obj”。这样一来,任何人都无法将模型输入 url。这是安全的,还是有人可以轻松查看所有公开的文件?

【问题讨论】:

  • 您使用的是 Passport 还是任何其他身份验证中间件?是否要将文件提供给所有登录用户?
  • @Tom 我正在通过乏味的方式使用 Azure AD 身份验证。我不想将文件提供给所有登录用户,但我认为这是唯一的方法。

标签: javascript node.js express path static-files


【解决方案1】:

是的,随机数有助于混淆其他用户的文件。您可以在发布请求中使用“multipart/form-data”将文件上传到节点服务器并将其保存在某个位置。保存后,您可以执行类似

的操作
res.redirect('http://example.com/mypage/'+generatedNumber);

在重定向页面上,您可以形成适当的路径并加载文件,就像它是服务器目录中的任何其他文件一样。

【讨论】:

  • 谢谢,这就是我的想法,我只是想仔细检查一下。 “帮助混淆”,有没有“完全混淆”?
  • 是的,您可以使用 md5 散列您的对象名称。这样它就可以创建一个 32 个字符长的字母数字哈希。那会让你散列 36^32 个具有唯一散列的文件名而不会发生冲突。如果您想要文件的完全安全性,您还可以使用文件流从节点服务器动态提供文件。这样,您还可以在服务之前检查用户是否有权访问特定文件。但是,以这种方式提供文件会产生一些性能开销。您可以根据自己的用例接听电话。
  • 您可以使用 res.sendfile 将文件与 content-type 标头一起发送,这将为您抽象底层文件流实现。
【解决方案2】:

您可以保留一个通用的Url来下载文件,只需发送您可以下载文件的文件夹名称,这样您就可以将您的文件保存在任何地方,而不必在公共文件夹中。

app.all('/getModelFile', function (req, res) {
    res.sendFile('model.obj', {root: './public/pages/models/'+req.params.id});  // Params.id is 1982746 <- the folder name you can have mulitple model files inside the models folder send the folder name as id and fetch the file.
});

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 2017-07-30
    • 2012-04-27
    • 2021-12-15
    相关资源
    最近更新 更多