【发布时间】:2021-11-06 15:09:03
【问题描述】:
我在 Node.js 应用程序中使用 HTML5 <audio> 元素,并且在设置 src.track 时遇到了文件引用和特殊字符的问题。从我的 mySQLite3 数据库中引用文件位置时,我将发送一个格式为:
/Users/admin/Music/iTunes/iTunes Music/Nelly/Nellyville/13 #1.mp3
我收到以下错误:
GET file:///Users/admin/Music/iTunes/iTunes%20Music/Nelly/Nellyville/13%20 net::ERR_FILE_NOT_FOUND
这显然是在这个特定字符串中的“#”上出错并忽略了字符串的其余部分。此格式适用于所有引用,但具有特殊字符的引用除外。我尝试了所有我能想到的编码、转义和格式,包括encodeURIComponent() 和encodeURI()。
我可以使用encodeURIComponent() 在javascript 中输出一个字符串,它会生成一个工作链接,我可以将其粘贴到我的浏览器中以正确引用该文件。但是,如果我使用来自encodeURIComponent() 的输出设置我的track.src,它会将我的项目目录添加到字符串中并且错误如下:
GET file:///Users/admin/Code/project/src/%2FUsers%2Fadmin%2FMusic%2FiTunes%2FiTunes%20Music%2FNelly%2FNellyville%2F13%20%231.mp3 net::ERR_FAILED
【问题讨论】:
-
失败是因为你不能在网页中使用
file://URI,除非页面本身也是从file://URI 加载的。当您使用我假设在localhost上的 NodeJS 服务器时,您也需要通过 NodeJS 代理这些文件。注意目录遍历攻击。 -
@Dai 这是一个 Electron 应用程序,所以它会从同一个本地项目目录加载网页。我传递了没有
file://的字符串,我只是传递了原始目录路径,如上所述,然后我猜测audio元素正在执行某种URI 编码并添加file://。如果我不进行 URI 编码,它无法解析路径,如果我这样做,就会发生上述情况。
标签: javascript node.js html5-audio