#javascript #node.js #html5-audio
Вопрос:
Я использую элемент HTML5 <audio>
в Node.js приложение, и я сталкиваюсь с проблемами со ссылками на файлы и специальными символами при настройке src.track
. При ссылке на местоположение файла из моей базы данных mySQLite3 я отправлю местоположение в формате:
/Users/admin/Music/iTunes/iTunes Music/Nelly/Nellyville/13 #1.mp3
Я получаю следующую ошибку:
GET file:///Users/admin/Music/iTunes/iTunes Music/Nelly/Nellyville/13 net::ERR_FILE_NOT_FOUND
Это, очевидно, ошибка в «#» в этой конкретной строке и игнорирование остальной части строки. Это форматирование работает для всех ссылок, за исключением ссылок со специальными символами. Я перепробовал все типы кодирования, экранирования и форматирования, которые только мог придумать, включая encodeURIComponent()
и encodeURI()
.
Я могу вывести строку в javascript, используя encodeURIComponent()
которую создается рабочая ссылка, которую я могу вставить в свой браузер, чтобы правильно ссылаться на файл. Однако, если я настрою track.src
использование вывода из encodeURIComponent()
, он добавит каталог моего проекта в строку и выдаст ошибку как таковую:
GET file:///Users/admin/Code/project/src//Users/admin/Music/iTunes/iTunes Music/Nelly/Nellyville/13 #1.mp3 net::ERR_FAILED
Комментарии:
1. Это не удается, потому что вы не можете использовать
file://
URI на веб-страницах, если сама страница также не загружена изfile://
URI. Поскольку вы используете сервер NodeJS, который, как я предполагаю, включенlocalhost
, вам также потребуется прокси-сервер для этих файлов через NodeJS. Следите за атаками на обход каталогов.2. @Dai Это электронное приложение, поэтому оно будет загружать веб-страницу из того же локального каталога проекта. Я передаю строку без
file://
, я просто передаю необработанный путь к каталогу, как указано выше, затем я предполагаюaudio
, что элемент выполняет какую-то кодировку URI и добавляетfile://
. Если я не закодирую URI, он не сможет разрешить путь, если я это сделаю, произойдет описанное выше.
Ответ №1:
Хорошо, после, вероятно, 100 различных вариантов src
ввода в <audio>
элемент, я определил, что, по крайней мере, в моем приложении Electron он использует какой — то гибрид между encodeURI
и encodeURIComponent
. encodeURIComponent
кодирует»/», который не будет работать, но encodeURI
не кодирует символы, которые вызвали проблему, такие как «#». Итак, вот как я понял, как заставить это работать:
function URLFormat(input){
let URIencodedURL = encodeURIComponent(input);
let EncodedURL = 'file:///' URIencodedURL.replaceAll("/","/");
return EncodedURL;
}
Это дает мне правильный путь ввода для <audio>
элемента даже в случае файлов со специальными символами.