php脚本下载的图片打不开

WBOY
Freigeben: 2016-06-06 20:51:04
Original
1353 Leute haben es durchsucht

<?php /**
 * 抓取远程图片
 *
 * @param string $url 远程图片路径
 * @param string $filename 本地存储文件名
 */
function grabImage($url, $filename = '') {
    if($url == '') {
        return false; //如果 $url 为空则返回 false;
    }
    $ext_name = strrchr($url, '.'); //获取图片的扩展名
    if($ext_name != '.gif' && $ext_name != '.jpg' && $ext_name != '.bmp' && $ext_name != '.png') {
        return false; //格式不在允许的范围
    }
    if($filename == '') {
        $filename = time().$ext_name; //以时间戳另起名
    }
    //开始捕获
    ob_start();
    readfile($url);
    $img_data = ob_get_contents();
    ob_end_clean();
    $size = strlen($img_data);
    $local_file = fopen($filename , 'a');
    fwrite($local_file, $img_data);
    fclose($local_file);
    return $filename;
}
echo	grabImage("http://t1.baidu.com/it/u=1504295979,283866738&fm=52&gp=0.jpg");
?>
Nach dem Login kopieren
Nach dem Login kopieren

上述的代码感觉没有问题,别人也测试过,但是我下载下来,图片文件为什么打不开,蛋疼,坐等贵人解救!

回复内容:

<?php /**
 * 抓取远程图片
 *
 * @param string $url 远程图片路径
 * @param string $filename 本地存储文件名
 */
function grabImage($url, $filename = '') {
    if($url == '') {
        return false; //如果 $url 为空则返回 false;
    }
    $ext_name = strrchr($url, '.'); //获取图片的扩展名
    if($ext_name != '.gif' && $ext_name != '.jpg' && $ext_name != '.bmp' && $ext_name != '.png') {
        return false; //格式不在允许的范围
    }
    if($filename == '') {
        $filename = time().$ext_name; //以时间戳另起名
    }
    //开始捕获
    ob_start();
    readfile($url);
    $img_data = ob_get_contents();
    ob_end_clean();
    $size = strlen($img_data);
    $local_file = fopen($filename , 'a');
    fwrite($local_file, $img_data);
    fclose($local_file);
    return $filename;
}
echo	grabImage("http://t1.baidu.com/it/u=1504295979,283866738&fm=52&gp=0.jpg");
?>
Nach dem Login kopieren
Nach dem Login kopieren

上述的代码感觉没有问题,别人也测试过,但是我下载下来,图片文件为什么打不开,蛋疼,坐等贵人解救!

url错误了。这种写法要抓取静态路径图片。
并且http://t1.baidu.com/it/u=1504295979,2... 也不是个图片地址。或者是有访问限制的地址,本地直接访问无权限。
你可以打印$image_data变量看看

一个对的有访问权限的路径就无问题了。
grabImage("http://s.segmentfault.com/img/logo.pn...);

请使用curl函数进行获取,因为当某些网站采取防外联的时候需要考虑到,比如百度图片。

于是有以下函数:

function getImage($uri,$from){
ob_start();
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $uri);
if($from){
    curl_setopt($ch,CURLOPT_REFERER, $from);
}				
curl_exec($ch);
$img = ob_get_contents();
curl_close($ch);
ob_clean();
return $img;
}
Nach dem Login kopieren

调用:

$uri = "http://imgsrc.baidu.com/forum/pic/item/e55f70600c338744d0fbf8bd510fd9f9d62aa0b4.jpg";
$from = "http://tieba.baidu.com/i/28295132"; //这里请自行分析规律,一般情况分析HEADER中Referer

echo getImage($uri,$from);
Nach dem Login kopieren

若要保存为本地文件请使用二进制写入,如:

$fs = fopen("abc.jpg","w+");
fwrite($fs,getImage($uri,$from));
fclose($fs);
Nach dem Login kopieren

以上就是采集图片和采集防盗链图片的基本方法咯。

Verwandte Etiketten:
php
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage