Мне нужна помощь в воспроизведении моих загруженных видео в моем проекте 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>
Сделал ошибку, забыл исправить и отредактировать. это $ movie-> uploaded_path, но я все равно получаю ту же ошибку.
Если вы хотите показывать свой фильм, используя общедоступный путь, он должен быть относительно общей папки, какой путь хранится в uploaded_path?
Согласен с @adam, проверьте путь к видео. Пробовал то же самое с простым тегом video, и он отлично работает.
@adam $ path = $ request-> file ('uploaded_path') -> storeAs ('public / movies /', $ fileNameToStore); это?
Какое точное значение в вашей таблице?
в столбце uploaded_path у меня есть одно значение video_1542379322.mp4
@Gacho попробуйте /public/movies/{{$movie->uploaded_path}} или /movies/{{$movie->uploaded_path}}
@adam Пробовал оба, все еще получаю ошибку.
@Gacho, попробуйте ввести URL прямо в браузере.
@adam Я, по-видимому, создал символическую ссылку для каталога хранилища, используя команду artisan php artisan storage: link, и теперь мои загруженные файлы отправляются в хранилище / app / public / movies. Какой путь мне сейчас следует представить?
@Gacho Если я правильно понимаю документацию, похоже, что эта команда сделает элементы общедоступными в вашем браузере на /storage, поэтому попробуйте /storage/movies/{{$movie->uploaded_path}}
@adam Работает отлично. Большое спасибо






Создайте конечную точку для показа вашего фильма:
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>
src = "public/movies/{{$movie->id}}"Вы действительно храните имя файла как целое число?