Как получить файлы над каталогом сервера в Node.js

Я пытаюсь обслуживать аудиофайлы с помощью сервера node.js. Проблема в том, что я хочу получить любой аудиофайл на моем компьютере, но я не знаю, как сделать аудио-элементы в html для работы с каталогами над сервером. Естьэтот вопрос, который я нашел, но так как файлы, которые я хочу получить, всегда меняются, это не очень помогает.

Проект по сути является медиаплеером на браузере. Это будет в локальной сети, поэтому обслуживание всего на компьютере на самом деле не проблема. Я уже использую статическую функцию «экспресс» для изображений, JavaScript и CSS. Приложение хранит путь, имя и другую информацию, используяnedb.

 Kirill Slatin23 июл. 2016 г., 19:36
Слишком мало информации о том, как ваша заявка написана сейчас, чтобы иметь возможность ответить. Не могли бы вы поделиться существующим кодом?
 Ural Bayhan23 июл. 2016 г., 19:58
Хм, какой код мне нужно поделиться? Я имею в виду, что я не могу опубликовать все, но я могу опубликовать, если есть что-то конкретное. Я пытался объяснить это как можно лучше.

Ответы на вопрос(1)

Решение Вопроса

вы должны понимать, что node.js не обслуживает файлы по умолчанию. Таким образом, вы должны либо кодировать каждый отдельный запрос вручную, чтобы/foo Запрос генерирует контент из определенного файла или кода. Или вы должны создать некоторый набор отображений, где/content/foo говорит вашему серверу прочитать соответствующий каталог на вашем сервере, например/myservercontent/foo.

И есть различные инструменты, которые помогут вам создать это отображение для всей иерархии каталогов файлов (например,express.static()). Но любое отображение, подобное этому, имеет явный корень, где все запросы относятся к какому-либо корню. Вы можете определить, где вы хотите, чтобы этот корень был на вашем сервере. Это может быть даже корневой каталог вашего сервера (хотя по разным причинам это никогда не рекомендуется). Обычно этот корень устанавливается на какой-либо родительский каталог на жестком диске, который содержит ТОЛЬКО общедоступный веб-контент ниже этого родительского каталога. Это делается для того, чтобы вы НИКОГДА не создавали ситуацию, когда какой-то случайный веб-пользователь сможет получить доступ к файлам в вашей системе, которые вы не собираетесь открывать (такие как сертификаты HTTP, базы данных, код сервера, файлы паролей и т. Д.) ,

Все это говорит, что node.js позволяет вам делать практически все, что вы захотите. Если вы хотите предоставить доступ к какому-либо случайному файлу на вашем жестком диске в любом произвольном месте (что я бы никогда не рекомендовал), вы можете легко написать для этого код node.js Есть несколько способов добиться этого. Одним простым способом было бы просто создать маршрут, который принимает параметр запроса, где параметр запроса указывает путь к требуемому файлу, а затем этот дескриптор маршрута может прочитать этот файл и вернуть его. Это зияющая дыра в безопасности, достаточно большая, чтобы проехать через грузовик, поэтому я бы никогда не порекомендовал это.

Вместо этого вам действительно нужно собрать все файлы, которые вы хотите сделать доступными через ваш сервер, и поместить их в одну безопасную иерархию каталогов, а затем разрешить доступ к файлам в этой конкретной иерархии каталогов, а не где-либо еще на вашем жестком диске. ,

Теперь, когда вы объяснили немного больше о том, что вы делаете, вот одна идея:

Сканирование локального жесткого диска, чтобы определить все аудиофайлы, которые вы считаете безопасными для обмена. Будьте очень, очень осторожны с тем, что вы решили поделиться, поскольку ошибки могут открыть большие дыры в безопасности. Вам нужно будет оценить риски безопасности того, что вы делаете здесь, так как мы не понимаем полный контекст.

Когда вы соберете этот список аудиофайлов, сохраните этот список в каком-либо хранилище данных, которое используется вашим сервером, чтобы вы могли быстро получить доступ к списку в любое время. Я бы посоветовал вам создать уникальный идентификатор для каждого аудиофайла, который может облегчить обращение к нему в будущем.

Затем вы можете предложить удаленному пользователю список этих аудиофайлов, и они могут выбрать один. Выбранный ими аудиофайл затем может быть отправлен на сервер как часть запроса на воспроизведение определенного аудиофайла. Я бы предложил, чтобы файлы запрашивались только по идентификатору (по соображениям безопасности), хотя ваш пользовательский интерфейс может выбрать отображение исходного пути, если это важно или важно.

Когда ваш сервер получает запрос на воспроизведение аудиофайла с определенным идентификатором, он может обратиться к своему хранилищу данных, чтобы выяснить, какой аудиофайл является файлом с определенным идентификатором. Это важный шаг, потому что принуждение клиента запрашивать файл по идентификатору (а не по пути) делает его таким, чтобы клиент мог запрашивать только те аудиофайлы, которые вы предварительно отсканировали и обнаружили, что было безопасно обнародовать их. Не было бы никаких уязвимостей, когда удаленный клиент мог бы запросить какой-то другой файл, которым вы не намеревались поделиться.

Как только ваш сервер просматривает хранилище данных и находит аудиофайл с этим конкретным идентификатором, он может затем получить локальный путь из хранилища данных, а затем может прочитать аудиофайл и отправить / передать его на удаленный клиент.

Например, на шаге 3 и 4 клиент может отправить URL-адрес, который выглядит следующим образом:

Http: // someserver / игры / 5934902

Это был бы запрос на воспроизведение аудиофайла с идентификатором5934902, Ваш сервер будет иметь обработчик маршрута для/play/:id это будет использовать идентификатор, чтобы затем выполнить шаги 4 и 5.

 Ural Bayhan23 июл. 2016 г., 20:22
Я думаю, что получу это на этот раз. Теперь пытаюсь его кодировать, сообщу, когда я закончу. Спасибо за помощь.
 jfriend0023 июл. 2016 г., 20:19
Это потому, что вы должны направить аудио запрос на ваш сервер, например:<audio src="http://someserver/play/5934902"></audio> Таким образом, ваш сервер может получить соответствующий файл для браузера. Сам браузер не позволит вам играть в файловой системе таким образом. Вы должны использовать сервер, чтобы сделать это для вас. Обратите внимание, что вашему серверу также может потребоваться какая-то поддержка потоковой передачи мультимедиа (этой конкретной части, которую я мало знаю о том, что<audio> тег ожидает от сервера).
 jfriend0023 июл. 2016 г., 20:10
@UralBayhan - я добавил больше к своему ответу, связанному с обменом аудиофайлами.
 Ural Bayhan23 июл. 2016 г., 20:53
Спасибо человек, это сработало.
 Ural Bayhan23 июл. 2016 г., 20:18
Ну, это на самом деле то, что я делал, но я не понимаю последнюю часть. Когда я пытаюсь <audio src = "C: \ Users \ Lenovo \ Downloads \ abc.mp3"> </ audio>, консоль говорит: «Не разрешено загружать локальный ресурс». Вы говорите, что мне нужно что-то кроме аудио-элемента? Я подумал об использовании socket.io и отправить информацию о пути в веб-интерфейс JS, чтобы изменить HTML.
 Ural Bayhan23 июл. 2016 г., 19:53
Я отредактировал вопрос, чтобы дать больше информации. Я полностью понимаю, что вы говорите о безопасности. Но это приложение запускает сканирование на жестком диске, получает всю информацию об аудиофайлах и служит ему как медиаплеер. И он будет работать только в локальной сети, поэтому безопасность не выглядит для меня проблемой. Пожалуйста, поправьте меня, если я ошибаюсь.

Ваш ответ на вопрос