>백엔드 개발 >PHP 튜토리얼 >PHP批量下载指定路径图片实例

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

PHP中文网
PHP中文网원래의
2017-04-24 10:01:202084검색

知道服务器上图片所保存的路径,如何批量下载到本地,其中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(&#39;http://cdn.image.com/static/&#39; . $i . &#39;.png&#39;, DOWNLOAD_PATH . $i . &#39;.png&#39;);

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

 $referer) {
        // echo $url, "\n";
        $filename = pathinfo($url, PATHINFO_FILENAME) . &#39;.&#39; . 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 = &#39;//&#39;) {
    $content = file_get_contents($page);
    // $content = &#39;&#39;;
    preg_match_all($reg, $content, $matches);

    return $matches[1];
}

function download($url, $file, $referer = &#39;&#39;) {
    $url = abs_url($url, $referer);
    echo $url, "\n";

    $opts = [
        &#39;http&#39; => [
            '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으로 문의하세요.