Получение прямой ссылки на файл с расширением в Lumen

Я использую Lumen, и у меня есть аудиофайл в папке uploads/videos/. Я хочу вернуть URL-адрес точного пути (например, app.com/videos/one.mp4).

Я добился того же очень плохим способом, поместив /{fileName} в маршруты, указав /one.mp4 и удалив расширение из String, как только я получу данные (one.mp4). Это плохой способ, потому что я использую плагин, который принимает только прямые ссылки.

(Например, когда я беру ссылку из любой ссылки mp4 (с расширением), она работает, но когда я пробую ее своим методом, она не работает.

Я нашел этот пример для Laravel, однако Lumen, по-видимому, не принимает ->where:

Route::get('file/{filename}', 'FileController@getFile')->where('filename', '^[^/]+$');

and

 public function getFile($filename)
 {
  return response()->download(storage_path($filename), null, [], null);
 }

Но когда я пробую это в Lumen, я получаю:

Вызов неопределенного метода Laravel\Lumen\Application::where()

Как настроить маршрут, который получает имя файла с расширением в качестве параметров и возвращает файл mp4 в каталоге. Итак, в основном, я хочу нажать на ссылку myapi.com/videos/two.mp4 и воспроизвести two.mp4, как только я нажму на ссылку.

(Обратите внимание, что я храню имя файла в базе данных без расширения, как two для two.mp4.)

Пример формата ссылки: https://v.cdn.vine.co/r/videos/12B2B2092B1284614590713798656_4be40e9deb2.4.1.3029273185552527049.mp4

Обновление:

Этот фрагмент ниже воспроизводит звук в Chrome, но не в приложении, может быть, это из-за самого приложения, а не из-за Lumen? Но он успешно воспроизводит указанную выше ссылку Vine.

$app->get('/player/{filename}', 'PlayerController@show')

public function show ($filename)
{
    $this->playVid($filename, 'videos');
}

public function playVid($filename, $showType)
{
    if (file_exists("../uploads/" . $showType . "/" . $filename)) {
        $finfo = finfo_open(FILEINFO_MIME_TYPE);
        $type = finfo_file($finfo, "../uploads/" . $showType . "/" . $filename);

        header("Content-Type: " . $type);
        readfile("../uploads/" . $showType . "/" . $filename);
    }
}

Если да, то в чем разница между моим файлом и файлом Vine? Когда я открываю оба видео в браузере, щелкаю правой кнопкой мыши и проверяю источник, оба видео имеют type="video/mp4"


Дополнительная информация о вопросе: https://stackoverflow.com/questions/34369823/same-video-from-my-api-url-doesnt-work-where-works-from-online-url-from-proj

Обновление: я понял, что моя проблема была вызвана тем, что я использовал readFile, но я хотел использовать потоковую передачу. Если вы считаете, что это проблема, обратитесь сюда - https://stackoverflow.com/a/34435905/4705339


person senty    schedule 08.12.2015    source источник
comment
Я думаю, что ваш код в порядке. Были ли у вас какие-то ошибки или что именно, когда вы пробовали с вашим видео? Кроме того, не забывайте, что браузер может воспроизводить ограниченное количество видеоформатов, взгляните на мой ответ на этот вопрос ...   -  person akmozo    schedule 08.12.2015
comment
Я пробую это с демо-приложением для iOS — Player. Интересно, что и мои видео, и демо-видео имеют формат type="video/mp4" и оба воспроизводятся в браузере (хромированный ПК). Тем не менее, в демо-приложении для iOS Vine Video работает нормально, тогда как у меня просто черный экран. Никаких ошибок и прочего :/ В чем может быть проблема? Может ли это быть связано с кодеком (или с чем-то еще)? Или я делаю что-то не так, используя такой метод маршрута и контроллера?   -  person senty    schedule 08.12.2015