【问题标题】:Validate downloaded file from remote Url using Laravel 5.4使用 Laravel 5.4 验证从远程 URL 下载的文件
【发布时间】:2017-08-10 17:54:24
【问题描述】:

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

【问题讨论】:

    标签: php laravel laravel-5 laravel-5.4


    【解决方案1】:

    作为示例,您可以使用自定义验证器类。

    所以基本上我们有执行表单验证的控制器。

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

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

    【讨论】:

    • 您好,感谢您的回答。另一个级别的验证是什么意思?
    • 仅当您想在服务器上下载和存储文件时才需要。因此,您应该检查您是否实际下载了视频或图像,而不是其他类型的文件。
    猜你喜欢
    • 2022-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    • 2014-07-09
    相关资源
    最近更新 更多