在Laravel 5.4中,当提交表单时,请求中的文件(如果有)将传递给Illuminate \ Http \ File或Illuminate \ Http \ UploadedFile实例。但是,让我们说而不是文件,该文件的URL作为输入传递。当然,服务器必须向该输入URL发出请求才能下载该文件。在这种情况下,您将如何验证文件? (假设我想检查它的图像或视频)
答案 0 :(得分:0)
例如,您可以使用自定义Validator类。
所以基本上我们有控制器执行表格验证。
<?php
namespace App\Http\Controllers;
use App\Article;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use Validator;
class ArticleController extends Controller
{
/**
* Store a newly created resource in storage.
*
* @return Response
*/
public function store($id = 0)
{
$rules = [
'title' => 'required',
'body' => 'required',
'fileLink' => 'file_link',
];
$validator = Validator::make(Input::all(), $rules);
// process the login
if ($validator->fails()) {
return redirect()
->route('article.create')
->withErrors($validator);
} else {
//Other code
}
}
}
然后你必须创建自定义验证器:
<?php
namespace App\Validators;
class FileLinkValidator
{
public function validate($attribute, $value, $parameters, $validator)
{
$isValid = false;
$ch = curl_init($value);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if($code == 200){
$allowedContentTypes = [
'image/jpeg'
];
$contentType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
if(in_array($contentType,$allowedContentTypes)){
$isValid = true;
}
}
curl_close($ch);
return $isValid;
}
}
注册验证员:
<?php
namespace App\Providers;
use Config;
use Illuminate\Support\ServiceProvider;
use Validator;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Validator::extend('file_link', 'App\Validators\FileLinkValidator@validate','File Link should be valid url and contain file');
}
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
}
然后您可以在控制器中下载文件并将其保存在磁盘上,并将所有元数据保存到数据库中。但是,您必须执行另一级验证,以便为用户提供更安全的保护。