Я пытался прочитать аудиофайл из mongoDB, который я сохранил с помощью GridFS. Я могу загрузить файл в систему и играть с ним, но я хотел бы передать эти аудио/видео файлы из самой базы данных и воспроизвести их в браузере. Есть ли способ сделать это, не загружая файл в систему? Любая помощь будет хорошей.поток аудио/видео файлов из gridFS в браузере
ответ
Поддержка PHP GridFS имеет функцию MongoGridFSFile::getResource(), которая позволяет получить поток как ресурс - который не загружает весь файл в память. В сочетании с fread/echo
или stream_copy_to_stream вы можете предотвратить загрузку всего файла в память. С stream_copy_to_stream, вы можете просто скопировать ресурс в GridFSFile ручья в поток STDOUT:
<?php
$m = new MongoClient;
$images = $m->my_db->getGridFS('images');
$image = $images->findOne('mongo.png');
header('Content-type: image/png;');
$stream = $image->getResource();
stream_copy_to_stream($stream, STDOUT);
?>
В качестве альтернативы, вы можете использовать fseek()
на возвращаемом $stream
ресурс только послать назад части потока к клиенту. В сочетании с HTTP Range requests вы можете сделать это довольно эффективно.
Если other recipe не удается, например, с NginX
и php-fpm
, потому что STDOUT
не доступен в fpm
, вы можете использовать
fpassthru($stream);
вместо
stream_copy_to_stream($stream, STDOUT);
Так полное решение выглядит следующим образом:
function img($nr)
{
$mongo = new MongoClient();
$img = $mongo->ai->getGridFS('img')->findOne(array('metadata.nr'=>$nr));
if (!$img)
err("not found");
header('X-Accel-Buffering: no');
header("Content-type: ".$img->file["contentType"]);
header("Content-length: ".$img->getSize());
fpassthru($img->getResource());
exit(0);
}
FYI:
В этом примере:
- Файл не acccessed по имени файла, вместо этого он получает доступ к номеру, хранящегося в метаданных. Подсказка: вы можете установить уникальный индекс, чтобы гарантировать, что номер не может использоваться дважды.
- Content-Type также считывается из GridFS, поэтому вам не нужно жестко указывать это.
- Кэширование NginX выключено для включения потоковой передачи.
Таким образом, вы можете обрабатывать другие вещи, такие как видео или html-страницы. Если вы хотите включить кеширование NginX, возможно, только вывод X-Accel-Buffering
на больших размерах.
- 1. ошибка получения файлов из gridfs
- 2. Запись потока в gridfs-поток
- 3. Обслуживание файлов из GridFS с casbah/salat
- 4. Изображение, переданное из Gridfs Mongo's, не отображается в браузере
- 5. серверная сторона Mongodb Сжатие файлов GridFS
- 6. из OutputStream в поток файлов
- 7. 13 миллионов файлов gridfs mongo
- 8. IP-поток камеры в браузере
- 9. Как удалить файл из кусков и файлов в GridFS?
- 10. Получение файлов в GridFS для отправки из Flask?
- 11. Подсчет файлов с метаданными в GridFS
- 12. Mongo: избегать дублирования файлов в gridfs
- 13. Node.js, отображающий изображения из GridFS Mongo
- 14. Поток файлов из обработчика EventMachine?
- 15. Удалить поток файлов из памяти
- 16. Показать изображения из Gridfs
- 17. Обслуживание статических файлов через GridFS MongoDB
- 18. Удаление файла из GridFS
- 19. Получить выбор из файлов PDF в браузере
- 20. Поток файлов в Java
- 21. поток видео файлов через REST HTTP с искрой Java
- 22. Кэширование файлов в браузере
- 23. Как удалить файл изображения из GridFS по метаданным файлов?
- 24. Перенаправить поток файлов в поток памяти
- 25. Поток файлов из Dropbox в браузер пользователя
- 26. MongoDB GridFS для хранения файлов HA
- 27. Управление версиями файлов с помощью GridFS
- 28. Ошибка больших файлов с GridFS и MongoDB
- 29. Получение метаданных файлов с использованием python GridFS
- 30. сохраненных файлов непосредственно в MongoDB с gridfs потоком
Hey Derick. Я пытался получить звук, чтобы играть, но напрасно. Я уже написал вышеуказанный код, чтобы соответствовать моему коду, но я получаю плеер, но не файл для воспроизведения. Не могли бы вы помочь мне? – fastLearner
Я получаю файл, но не могу пропустить его, выполнив поиск (file_handle, length). Мой вопрос: если пользователь нажимает на временную шкалу игрока, то как мне позаботиться о смещении места, которое он нажал? – fastLearner
@ user2610503 Вам нужно будет подключить интерфейс для отдыха в ваше приложение, которое может принять представление flash/html5, запрашивающее пропуски из файла – Sammaye