使用Laravel 5.4验证从远程Url下载的文件

时间:2017-03-19 13:03:45

标签: php laravel laravel-5 laravel-5.4

在Laravel 5.4中,当提交表单时,请求中的文件(如果有)将传递给Illuminate \ Http \ File或Illuminate \ Http \ UploadedFile实例。但是,让我们说而不是文件,该文件的URL作为输入传递。当然,服务器必须向该输入URL发出请求才能下载该文件。在这种情况下,您将如何验证文件? (假设我想检查它的图像或视频)

1 个答案:

答案 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()
    {
       //
    }
}

然后您可以在控制器中下载文件并将其保存在磁盘上,并将所有元数据保存到数据库中。但是,您必须执行另一级验证,以便为用户提供更安全的保护。