Php Laravel:将var传递给控制器以动态地从存储中检索项
我的Php Laravel:将var传递给控制器以动态地从存储中检索项,php,laravel,laravel-5,Php,Laravel,Laravel 5,我的文件控制器中有以下功能,可从我的存储器(本地)检索视频: 在我的web.php中,我有以下route: Route::get('/get-video/', 'FileController@getVideo')->name('get-video'); 最后,在我的视图中,我有以下内容: <video controls> <source src="{{ route('get-video') }}" type="video/mp4"> Your b
文件控制器中有以下功能,可从我的存储器(本地)
检索视频:
在我的web.php
中,我有以下route
:
Route::get('/get-video/', 'FileController@getVideo')->name('get-video');
最后,在我的视图中
,我有以下内容:
<video controls>
<source src="{{ route('get-video') }}" type="video/mp4">
Your browser does not support the video tag.
</video>
然后,我将路线
更改为使用var
:
Route::get('/get-video/{video_name}', 'FileController@getVideo')->name('get-video');
最后,在我的视图中
,我将var
传递给路由
<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存储:链接
旁注:mp4的
/map\u name/name\u是我可以从数据库中检索到的每个视频的/code>部分。这与在路由参数中使用/
字符有关,默认情况下,该字符不起作用,因为它是用于分隔路由参数的分隔符
您可以尝试按以下方式定义路线以克服此问题:
Route::get('/get-video/{video_name}', 'FileController@getVideo')->name('get-video')->where('video_name', '(.*)');
在中,您可以定义一个与route参数匹配的正则表达式,在本例中,*
匹配/get video/
之后的所有内容
您可以像这样使用它:
{{ route('get-video', ['video_name' => 'map_name/name_of_video.mp4']) }}
不是我删除了路由示例中的前导/
,以防止路径中出现重复的/
字符。有点离题,但我确实想留下几句话供将来研究/改进代码:-确保用户无法访问视频(或可能存储的其他文件)例如,他们不应该通过对照数据库中的记录来检查文件名。-研究如何将文件流式传输回用户,而不是使用get
并将其转换为响应,因为这样会将整个文件加载到内存中,从而导致大文件出现问题。另请参见:我将对此进行调查!谢谢。
Route::get('/get-video/{video_name}', 'FileController@getVideo')->name('get-video')->where('video_name', '(.*)');
{{ route('get-video', ['video_name' => 'map_name/name_of_video.mp4']) }}