【问题标题】:How to get files above the server directory in Node.js如何在 Node.js 中获取服务器目录上方的文件
【发布时间】:2016-11-05 23:05:48
【问题描述】:

我正在尝试使用 node.js 服务器提供音频文件。问题是,我希望能够在我的计算机中获取任何音频文件,但我不知道如何使 html 中的音频元素与服务器上方的目录一起使用。我发现了this 问题,但由于我希望能够随时更改的文件并没有真正帮助。

该项目基本上是浏览器上的媒体播放器。它将在 LAN 上,因此为计算机中的所有内容提供服务并不是真正的问题。我已经在使用 express 的静态函数来处理图像、javascript 和 css。该应用程序使用nedb 保存路径、名称和其他信息。

【问题讨论】:

  • 现在关于您的应用程序如何编写的信息太少,无法回答。你能分享一些现有的代码吗?
  • 呃,我需要分享什么代码?我的意思是我不能发布所有内容,但如果有任何具体内容,我可以发布。我尽量解释清楚。

标签: javascript node.js


【解决方案1】:

首先,您必须了解 node.js 默认不提供任何文件。因此,您必须手动编码每个单独的请求,以便/foo 请求从某些特定文件或代码生成内容。或者您必须创建一组映射,其中/content/foo 告诉您的服务器读取服务器上的一些相应目录,例如/myservercontent/foo

而且,有多种工具可帮助您为文件的整个目录层次结构创建此映射(例如 express.static())。但是,任何像这样的映射都有一个明确的根,其中所有请求都相对于某个根。您可以定义您希望此根在您的服务器上的位置。它甚至可以是您服务器的根目录(尽管出于各种原因从不推荐这样做)。通常,此根目录设置为硬盘上的某个父目录,该目录仅包含该父目录下的公共 Web 内容。这样您就永远不会造成某些随机 Web 用户可以访问系统上您不打算公开的文件(例如您的 HTTPS 证书、数据库、服务器代码、密码文件等)的情况.

话虽如此,node.js 允许您做几乎任何您想做的事情。如果您想在任何随机位置访问硬盘驱动器上的某些随机文件(我绝不会推荐),您可以轻松编写 node.js 代码来做到这一点。有几种方法可以实现它。一个简单的方法是构建一个接受查询参数的路由,其中​​查询参数指定所需文件的路径,然后让该路由句柄读取该文件并返回它。这是一个巨大的安全漏洞,足以让一辆卡车通过,所以我永远不会推荐这个。

相反,您真正应该做的是收集您希望通过服务器提供的所有文件,并将它们放入一个安全的目录层次结构中,然后允许访问该特定目录层次结构中的文件,而不是其他任何地方你的硬盘。


既然您已经解释了更多关于您在做什么,这里有一个想法:

  1. 扫描本地硬盘以识别您认为可以安全共享的所有音频文件。要非常非常小心你决定分享的内容,因为这里的错误可能会打开很大的安全漏洞。由于我们不了解完整的上下文,因此您必须评估您在此处所做的事情的安全风险。

  2. 当您收集此音频文件列表时,请将列表保存到您的服务器正在使用的某种数据存储中,以便您可以在以后的任何时间快速访问该列表。我建议您为每个音频文件创建一个唯一 ID,以便将来更容易引用。

  3. 然后,您可以向远程用户提供这些音频文件的列表,他们可以选择一个。然后可以将他们选择的音频文件作为播放特定音频文件的请求的一部分发送到服务器。我建议只通过 ID 请求文件(出于安全原因),但如果重要或相关,您的用户界面可能会选择显示原始路径名。

  4. 当您的服务器收到播放具有特定 ID 的音频文件的请求时,它可以查询其数据存储以找出哪个音频文件是具有特定 ID 的文件。这是一个重要的步骤,因为强制客户端通过 ID(而不是路径)请求文件使得客户端只能请求您之前扫描并发现可以安全公开的音频文件。不会存在远程客户端可以请求您不打算共享的其他文件的漏洞。

  5. 一旦您的服务器在数据存储中查找并找到具有该特定 ID 的音频文件,它就可以从数据存储中获取本地路径,然后可以读取音频文件并将其发送/流式传输到远程客户端。


例如,在第 3 步和第 4 步中,客户端可能会发送如下所示的 URL:

http://someserver/play/5934902

这将是一个播放 id 为 5934902 的音频文件的请求。然后,您的服务器将拥有/play/:id 的路由处理程序,该处理程序将使用该 ID 执行步骤 4 和 5。

【讨论】:

  • 我编辑了问题以提供更多信息。我完全理解你所说的安全性。但是这个应用程序在硬盘驱动器上运行扫描,获取所有音频文件信息并像媒体播放器一样提供服务。而且它只会在局域网中运行,所以对我来说安全性看起来并不是一个问题。如果我错了,请纠正我。
  • @UralBayhan - 我在与音频文件共享相关的答案中添加了更多内容。
  • 嗯,这实际上是我正在做的,但我没有得到最后一部分。当我尝试 时,控制台显示“不允许加载本地资源”。你说我需要音频元素以外的东西吗?我想到了使用socket.io并将路径信息发送到前端js来更改html。
  • 那是因为您必须将音频请求定向到您的服务器,例如:<audio src="http://someserver/play/5934902"></audio>,这样您的服务器才能为浏览器获取适当的文件。浏览器本身不会让你以这种方式在文件系统中播放。您必须使用服务器为您执行此操作。请注意,您的服务器可能还需要某种媒体流支持(我不太了解<audio> 标签对服务器的期望)。
  • 我想这次我明白了。现在尝试对其进行编码,将在我完成时通知。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-17
  • 2020-12-17
  • 2015-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多