下载前检查 Valid/Active 个 URL - Laravel 7

Check for Valid/Active URLs before download - Laravel 7

我正在尝试检查下载图像并将其本地存储在我的资产文件夹中。 在开始下载之前,我想检查并确保 link 仍然有效。

我只想在 link 在线时开始下载 200 好的。

尝试#1

public function handle()
{
    $skills = Skill::all();

    if($skills != null){

        foreach($skills as $i=>$skill){

            if (strpos($skill->img_path, 'http') !== false) {
                if(!isset($exception)) {

                    //update the path in DB
                    $image_path      = '/assets/fe/img/skill/';
                    $img_name        = $skill->name.'.png';
                    $path            = public_path() . $image_path . $img_name;
                    $uploadSuccess   = file_put_contents($path, file_get_contents($skill->img_path));

                    // dd($uploadSuccess);

                    if($uploadSuccess) {
                        $skill->img_path = $image_path . $img_name;
                    }

                }

            }

            $skill->save();

        }

    }
}

我好像遇到了很多问题

其中之一是

curl: (6) Could not resolve host: thumbsplus.tutsplus.com

另一个是

file_get_contents(https://assets-cdn.github.com/images/modules/logos_page/Octocat.png): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found

更清洁的方法是什么?请建议,我现在试试


尝试#2

public function handle()
{
    $skills = Skill::all();

    if($skills != null){

        foreach($skills as $i=>$skill){

            if (strpos($skill->img_path, 'http') !== false) {

                $file_headers = @get_headers($skill->img_path);
                if(!$file_headers || $file_headers[0] == 'HTTP/1.1 404 Not Found') {
                    $exists = false;
                }
                else {
                    $exists = true;

                    if(!isset($exception)) {

                    //update the path in DB
                        $image_path      = '/assets/fe/img/skill/';
                        $img_name        = $skill->name.'.png';
                        $path            = public_path() . $image_path . $img_name;
                        $uploadSuccess   = file_put_contents($path, file_get_contents($skill->img_path));

                    // dd($uploadSuccess);

                        if($uploadSuccess) {
                            $skill->img_path = $image_path . $img_name;
                        }

                    }
                }

            }

            $skill->save();

        }

    }
}

尝试#3

public function handle()

{
    $skills = Skill::all();


    $failCount = 0;
    $successCount = 0;


    $failList = [];

    if($skills != null){

        foreach($skills as $i=>$skill){

            if (strpos($skill->img_path, 'http') !== false) {


                $file_headers = @get_headers($skill->img_path);
                if(!$file_headers || strpos($file_headers[0], '404') !== false) {
                    $exists = false;
                    $failCount++;

                    array_push($failList,$skill->name);
                    // break;
                }
                else {


                    $exists = true;
                    $successCount++;


                    //DEBUG
                    // dd($file_headers[0]);


                    if(strpos($file_headers[0], '200')) {

                        //update the path in DB
                        $image_path      = '/assets/fe/img/skill/';
                        $img_name        = $skill->name.'.png';
                        $path            = public_path() . $image_path . $img_name;
                        $uploadSuccess   = file_put_contents($path, file_get_contents($skill->img_path));


                    // dd($uploadSuccess);

                        if($uploadSuccess) {
                            $skill->img_path = $image_path . $img_name;
                        }

                    }


                }

            }

            $skill->save();
            echo ".";
        }

    }


    echo "\r\n";

    $this->info('=========================');
    $this->info('Success :'. $successCount);
    $this->info('=========================');
    $this->info('Fail    :'. $failCount);
    $this->info('List    :'. print_r($failList));
    $this->info('=========================');

}

似乎有效

但它在某个 dot

时挂起,有时超过 1 分钟
⚡️  php artisan skillIcons:download                                                                           
..............................................................................................................................                                                                                                                  
=========================                                                                                               
Success :12                                                                                                             
=========================                                                                                               
Fail    :7                                                                                                              
Array                                                                                                                   
(                                                                                                                       
    [0] => GitHub                                                                                                       
    [1] => Geolocation API                                                                                              
    [2] => Xcode                                                                                                        
    [3] => Protractor                                                                                                   
    [4] => Sketch                                                                                                       
    [5] => Amazon ECR                                                                                                   
    [6] => WinSCP                                                                                                       
)
List    :1
=========================

似乎所有图片都下载成功

⚡️   ls public/assets/fe/img/skill/
AWS Console.png         Digital Ocean.png       Javascript.png          PayPal.png              Terminal.png
AWS.png                 Disqus.png              Jest.png                Photoshop.png           TextMate.png
Alimofire.png           Divvy.png               Jira.png                Pod.png                 TextWrangler.png
Amazon ECS.png          Docker.png              Kamar.png               PostgreSQL.png          Transmit.png
Amazon RDS.png          Duet.png                LESS.png                PyCharm.png             Twitter.png
Angular.png             EC2.png                 Laravel Elixir.png      Python.png              Ubuntu.png
AngularJS.png           Evernote .png           Laravel.png             QuickBooks.png          VMWare Fusion .png
Apache.png              Express.png             Linode.png              React Native.png        VS Code.png
Atom.png                Facebook.png            Mac OS X.png            Realm.png               Vagrant.png
Bash.png                Final Cut.png           Markdown.png            Redis.png               Virtual Machine.png
BitBucket.png           FusionCharts.png        MobaXTerm.png           RequireJS.png           Virtualbox.png
Bower.png               GitLab.png              Mocha.png               S3.png                  Webpack.png
CKEditor.png            Go Daddy.png            MySQL.png               SAML 2.0.png            Windows.png
CSS.png                 Google Chart.png        NPM.png                 Salesforce.png          Wireshark.png
Camtasia.png            Google Map.png          Navicat Premium.png     Sass.png                Word.png
Cent OS.png             Google Translation.png  Nginx.png               Secure Shell.png        Yarn.png
Chai.png                Gulp.png                Node.png                Selenium.png            iMovie.png
Chat.io.png             HTML.png                Noteability.png         Shopify.png             iOS.png
Coda.png                Heroku.png              OAuth 2.0.png           SinonJS.png             jQuery.png
CodeBox.png             Illustrator.png         Open  Stack.png         Siteground.png
Composer .png           Instagram.png           OpenID Connect.png      Sublime Text.png
Confluence .png         J Player.png            PHP.png                 Swagger.png

3秒

如何将等待时间减少到仅 3 秒?

你必须以某种方式处理错误。 你可以试试

try {
    ...
} catch () {
    ...
}

但我更喜欢这样做

public function handle()
{
    Skill::get()->map(function($skill){
        if(strpos($skill->img_path, 'http')) return;
        $img = $this->getImageFromUrl($skill->img_path)
        if(!$img == null) return;

        $image_path      = '/assets/fe/img/skill/';
        $img_name        = $skill->name.'.png';
        $path            = public_path() . $image_path . $img_name;
        $fp = fopen($path,'x');
        fwrite($fp, $img);
        fclose($fp);

        if($uploadSuccess) {
            $skill->img_path = $image_path . $img_name;
            $skill->save();
        }
    });
}

public function getImageFromUrl($url){
    $ch = curl_init ($url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0); // The number of seconds to wait while trying to connect. Use 0 to wait indefinitely.
    curl_setopt($ch, CURLOPT_TIMEOUT, 2); // The maximum number of seconds to allow cURL functions to execute

    $img = curl_exec($ch);
    $err = curl_error($ch);

    if($err) {
        echo $err;
        return null;
    }

    curl_close($ch);

    return $img;
}

我重构了一些代码,如果你喜欢这个,请保留它,如果不是只获取逻辑并按你喜欢的方式去做

希望对您有所帮助

您可以使用 active_url 验证规则来检查给定的 URL 是否存在。根据文档:

The field under validation must have a valid A or AAAA record according to the dns_get_record PHP function. The hostname of the provided URL is extracted using the parse_url PHP function before being passed to dns_get_record.

if (validator([$skill->img_path], ['active_url'])->fails()) {
    // URL is not valid/active
}
else {
    // URL is valid/active   
}