• 技术文章 >后端开发 >php教程

    PHP批量下载指定路径图片实例

    PHP中文网PHP中文网2017-04-24 10:01:20原创1187

    知道服务器上图片所保存的路径,如何批量下载到本地,其中850文件夹及014文件名都从000开始匹配,文件存在就下载,否则略过。

    以下代码只能下载指定页面的:(望大神指教,谢过!)

    <?php
    
    $url = "http://site.com/";
    $content=file_get_contents($url);
    $reg="//";
    
    preg_match_all($reg,$content,$matches);

    以下代码只能下载指定页面的:(,望大神指教,谢过!

    <?php
    
    $url = "http://site.com/";
    $content=file_get_contents($url);
    $reg="//";
    
    preg_match_all($reg,$content,$matches);
    
    $path = './imgDownload';
    if(!file_exists($path)){
        mkdir($path, 0777);
    }
    
    for($i = 0;$i < count($matches[1]);$i ++){
    
        /*explode
        $url_arr[$i] = explode('/', $matches[1][$i]);
        $last = count($url_arr[$i])-1;
        */
    
        //strrchr   
        $filename = strrchr($matches[1][$i], '/');
    
        downImage($matches[1][$i],$path.$filename);
        //downImage($matches[1][$i],$path.'/'.$url_arr[$i][$last]);
    }
    
    function downImage($url,$filename="") {
        if($url=="") return false;
    
        if($filename=="") {
            $ext=strrchr($url,".");
            if($ext!=".gif" && $ext!=".jpg" && $ext!=".png" && $ext!="jpeg") return false;
            $filename=date("YmdHis").$ext;
        }
    
        ob_start();
        //make file that output from url goes to buffer
        readfile($url);
        //file_get_contents($url);  这个方法不行的!!!只能用readfile
        $img = ob_get_contents();
        ob_end_clean();
    
        $fp=@fopen($filename, "a");//append
        fwrite($fp,$img);
    
        fclose($fp);
    
        return $filename;
    }

    可以使用 curl_multi_* 系列函数批量请求远程地址。 把所有需要请求的页面放到一个数组里,每次并发20个去请求。
    建议修改下程序思路,先批量根据页面地址获取需要下载的图片地址,第二步再批量处理图片下载。
    两个部分的都可以用 culr_multi_*系列函数去并发处理。

    代碼寫得太糟糕了,還有幾處錯誤,幫你重寫一份。

    在一個循環里多次調用 addPage 就行了。

    如果已經有 url 的話,也可以直接調用 download

    for ($i = 0; $i < 99; ++$i)
        download('http://cdn.image.com/static/' . $i . '.png', DOWNLOAD_PATH . $i . '.png');

    效率有點低,可以考慮改用 culr_multi_* 系列函數。

     $referer) {
            // echo $url, "\n";
            $filename = pathinfo($url, PATHINFO_FILENAME) . '.' . pathinfo($url, PATHINFO_EXTENSION);
            download($url, $path . $filename, $referer);
        }
        // error_reporting(1);
    }
    
    
    function addPage($page, &$urls) {
        $cur = extractPage($page);
    
        for ($i = 0, $n = count($cur); $i < $n; ++$i) {
            $j = $cur[$i];
    
            if (!isset($urls[$j]))
                $urls[$j] = $page;
        }
    }
    
    function extractPage($page, $reg = '//') {
        $content = file_get_contents($page);
        // $content = '';
        preg_match_all($reg, $content, $matches);
    
        return $matches[1];
    }
    
    function download($url, $file, $referer = '') {
        $url = abs_url($url, $referer);
        echo $url, "\n";
    
        $opts = [
            'http' => [
                'method' => 'GET',
                'header' => "Accept-language: en\r\n" . 
                            // "Cookie: \r\n" .
                            "Referer: " . $url . "\r\n"
            ]
        ];
    
        $context = stream_context_create($opts);
    
        file_put_contents($file, file_get_contents($url, false, $context));
    
        return $file;
    }
    
    function abs_url($url, $referer) {
        $com = parse_url($url);
    
        if (!isset($com['scheme']))
            $com['scheme'] = 'http';
    
        if ($referer !== '') {
            $ref = parse_url($referer);
    
            if (!isset($com['host'])) {
                if (isset($ref['host'])) {
                    $com['host'] = $ref['host'];
                    if (!isset($ref['path']))
                        $ref['path'] = '/';
                }
    
                if (isset($com['path'][0])) {
                    if ($com['path'][0] !== '/')
                        $com['path'] = $ref['path'] . $com['path'];
                } else if (isset($ref['host'])) {
                    $com['path'] = $ref['path'];
                }
            } else {
                if (!isset($com['path']))
                    $com['path'] = '';
            }
        }
    
        return unparse_url($com);
    }
    
    function unparse_url($com) {
        return (isset($com['host']) ? ($com['scheme'] . '://' . $com['host']) : '') . $com['path'] . (isset($com['query']) ? '?'.$com['query'] : '');
    }
    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:php,下载,图片
    上一篇:正则表达式 - 如何把一个PHP中递归正则的语句替换为JavaScript非递归的语句? 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • 聊聊ChatGPT是啥?PHP怎么使用ChatGPT?• 一文详解PHP用流方式实现下载文件(附代码示例)• PHP反序列化入门总结(小白必看)• PHP原生类的总结分享• 聊聊PHP escapeshellarg函数使用的中文问题
    1/1

    PHP中文网