我的FileController
中具有以下功能,可从我的storage (local)
中检索视频:
function getVideo() {
$video = Storage::disk('local')->get("uploads/map_name/name_of_video.mp4");
$response = Response::make( $video, 200 );
$response->header( 'Content-Type', 'video/mp4' );
return $response;
}
在我的web.php
中,我有以下route
:
Route::get('/get-video/', 'FileController@getVideo')->name('get-video');
最后,在我的view
中,我具有以下内容:
<video controls>
<source src="{{ route('get-video') }}" type="video/mp4">
Your browser does not support the video tag.
</video>
这很好。该视频显示在我的视图中。但是,我想使此函数动态化,但似乎无法正常工作。我进行了以下更改:
首先,我将var
传递给getVideo
函数,并将其传递给get
函数:
function getVideo($video_name) {
$video = Storage::disk('local')->get("uploads/{$video_name}");
$response = Response::make( $video, 200 );
$response->header( 'Content-Type', 'video/mp4' );
return $response;
}
然后,我将route
更改为var
:
Route::get('/get-video/{video_name}', 'FileController@getVideo')->name('get-video');
最后,在我的view
中,我将var
传递给route
<video controls>
<source src="{{ route('get-video', ['video_name' => '/map_name/name_of_video.mp4']) }}" type="video/mp4">
Your browser does not support the video tag.
</video>
但是,这导致未找到404。我得到这条路线:
https://mysite.local/get-video/map_name/name_of_video.mp4
。
请注意,/upload
部分未呈现。但是,如果我手动添加,路由也会失败。
我也已经做过php artisan storage:link
。
旁注:/map_name/name_of_video.mp4
部分是我可以从database
中检索到的每个视频的内容。
答案 0 :(得分:1)
这与您有关,在路由参数中使用/
字符,该字符在默认情况下不起作用,因为这是用于分隔路由参数的分隔符。
您可以尝试通过以下方法定义路线以克服该问题:
Route::get('/get-video/{video_name}', 'FileController@getVideo')->name('get-video')->where('video_name', '(.*)');
您可以在where
中定义一个与route参数匹配的正则表达式,在这种情况下,.*
与/get-video/
之后的所有内容都匹配。
您可以像这样使用它:
{{ route('get-video', ['video_name' => 'map_name/name_of_video.mp4']) }}
不是,我删除了路由示例中的前导/
,以防止路径中出现重复的/
字符。