Как просматривать видео в проекте Laravel?

Мне нужна помощь в воспроизведении моих загруженных видео в моем проекте Laravel. Я могу загрузить их, и они отображаются в базе данных, но я не могу воспроизвести их в своем представлении и получаю сообщение об ошибке «Носитель не может быть загружен либо из-за сбоя сервера или сети, либо из-за того, что формат не поддерживается». Я использую Video.js. Вот мой код

Контроллер:

public function store(MovieRequest $request)
{
    DB::beginTransaction();
    try {
        $movie = new Movie;

        $movie->movie_name = $request->input('movie_name');

        if ($request->hasFile('uploaded_path')) {
            $filenameWithExt = $request->file('uploaded_path')->getClientOriginalName();
            $filename = pathinfo($filenameWithExt, PATHINFO_FILENAME);
            $extension = $request->file('uploaded_path')->getClientOriginalExtension();
            $fileNameToStore = $filename. '_'.time().'.'.$extension;
            $path = $request->file('uploaded_path')->storeAs('public/movies/', $fileNameToStore);
        } else {
            $fileNameToStore = 'novideo.mp4';
        }
        $movie->uploaded_path = $fileNameToStore;

        $movie->save();

        $movie->actors()->attach($request->input('actor_id'));
        $movie->categories()->attach($request->input('category_id'));

        DB::commit();
    } catch (\Exception $e) {
        DB::rollBack();
    }
    Session::flash('success', 'A movie was successfully UPLOADED in the database!');
    return redirect()->route('movies.index');
}

MovieRequest:

public function rules()
{
    return [
        'movie_name' => 'required|max:255',
        'uploaded_path' => 'mimetypes:video/avi,video/mpeg,video/mp4|required',
        'category_id' => 'required|exists:mysql.categories,id',
        'actor_id' => 'required|exists:mysql.actors,id'
    ];
}

Вид:

<tbody>
    @foreach ($movies as $movie)
        <tr>
            <td>{{ $movie->id }}</td>
            <td>{{ $movie->movie_name }}</td>


            <td>
                <video id = "my-video" class = "video-js" controls preload = "auto" width = "200" height = "100" data-setup = "{}">
                   <source src = "public/movies/{{$movie->uploaded_path}}" type='video/mp4'>
                </video>
            </td>


            <td>
            @foreach ($movie->actors as $actor)
                <a href = "{{ route('actors.edit', $actor->id) }}">{{$actor->actor_name}} @unless($loop->last)
            , 
            @endunless</a>
            @endforeach
            </td>
            <td>
            @foreach ($movie->categories as $category)
                <a href = "{{ route('categories.edit', $category->id) }}">{{$category->category_name}} @unless($loop->last)
                        , 
                        @endunless</a>
            @endforeach
            </td>
            <td>{{ date('M j, Y', strtotime($movie->created_at)) }}</td>
            <td><a href = "{{ route('movies.edit', $movie->id) }}" class = "btn btn-default btn-sm">Edit</a></td>
            </tr>
            @endforeach
            </tbody>
src = "public/movies/{{$movie->id}}" Вы действительно храните имя файла как целое число?
Devon 16.11.2018 16:46

Сделал ошибку, забыл исправить и отредактировать. это $ movie-> uploaded_path, но я все равно получаю ту же ошибку.

rose 16.11.2018 17:00

Если вы хотите показывать свой фильм, используя общедоступный путь, он должен быть относительно общей папки, какой путь хранится в uploaded_path?

adam 16.11.2018 17:14

Согласен с @adam, проверьте путь к видео. Пробовал то же самое с простым тегом video, и он отлично работает.

Philipp Palmtag 16.11.2018 17:20

@adam $ path = $ request-> file ('uploaded_path') -> storeAs ('public / movies /', $ fileNameToStore); это?

rose 16.11.2018 17:31

Какое точное значение в вашей таблице?

adam 16.11.2018 17:34

в столбце uploaded_path у меня есть одно значение video_1542379322.mp4

rose 16.11.2018 17:38

@Gacho попробуйте /public/movies/{{$movie->uploaded_path}} или /movies/{{$movie->uploaded_path}}

adam 16.11.2018 18:07

@adam Пробовал оба, все еще получаю ошибку.

rose 16.11.2018 18:30

@Gacho, попробуйте ввести URL прямо в браузере.

adam 16.11.2018 18:34

@adam Я, по-видимому, создал символическую ссылку для каталога хранилища, используя команду artisan php artisan storage: link, и теперь мои загруженные файлы отправляются в хранилище / app / public / movies. Какой путь мне сейчас следует представить?

rose 16.11.2018 19:22

@Gacho Если я правильно понимаю документацию, похоже, что эта команда сделает элементы общедоступными в вашем браузере на /storage, поэтому попробуйте /storage/movies/{{$movie->uploaded_path}}

adam 16.11.2018 20:31

@adam Работает отлично. Большое спасибо

rose 16.11.2018 20:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
13
2 597
1

Ответы 1

Создайте конечную точку для показа вашего фильма:

Route::get('/movie/{id}', ['uses' => 'MovieController@downloadMovie']);

Добавьте метод в свой контроллер:

public function downloadMovie($id)
{
    $movie = Movie::findOrFail($id);
    // download the movie
    return Response::download($movie->uploaded_path);
}

Тогда, на ваш взгляд:

 <video id = "my-video" class = "video-js" controls preload = "auto" width = "200" height = "100" data-setup = "{}">
     <source src = "/movie/{{$movie->getKey()}}" type='video/mp4'>
 </video>

Другие вопросы по теме