北极寒流 » 网络资源 » php获取远程图片并下载保存到本地 - 2018.07.13

php获取远程图片并下载保存到本地

php获取远程图片并下载保存到本地的方法。收藏备忘

远程图片指的是远端服务器上的数据我们可以通过php的许多函数来读取下载了,这里整理了几个可以自动下载远程图片并下载保存到本地的方法。

方法1,可以自动识别图片类型然后进行对应的保存

/*

*功能:php完美实现下载远程图片保存到本地

*参数:文件url,保存文件目录,保存文件名称,使用的下载方式

*当保存文件名称为空时则使用远程文件原来的名称

*/

function getImage($url,$save_dir='',$filename='',$type=0){

if(trim($url)==''){

return array('file_name'=>'','save_path'=>'','error'=>1);

}

if(trim($save_dir)==''){

$save_dir='./';

}

if(trim($filename)==''){//保存文件名

$ext=strrchr($url,'.');

if($ext!='.gif'&&$ext!='.jpg'){

return array('file_name'=>'','save_path'=>'','error'=>3);

}

$filename=time().$ext;

}

if(0!==strrpos($save_dir,'/')){

$save_dir.='/';

}

//创建保存目录

if(!file_exists($save_dir)&&!mkdir($save_dir,0777,true)){

return array('file_name'=>'','save_path'=>'','error'=>5);

}

//获取远程文件所采用的方法

if($type){

$ch=curl_init();

$timeout=5;

curl_setopt($ch,CURLOPT_URL,$url);

curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);

curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);

$img=curl_exec($ch);

curl_close($ch);

}else{

ob_start();

readfile($url);

$img=ob_get_contents();

ob_end_clean();

}

//$size=strlen($img);

//文件大小

$fp2=@fopen($save_dir.$filename,'a');

fwrite($fp2,$img);

fclose($fp2);

unset($img,$url);

return array('file_name'=>$filename,'save_path'=>$save_dir.$filename,'error'=>0);

}

注意:当请求https的数据时,会要求证书,需要加上下面这两个参数,规避ssl的证书检查

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE );

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);

方法2,如果不是图片会自动跳过

<?php

function GrabImage($url, $filename = "") {

if ($url == ""):return false;

endif;

//如果$url地址为空,直接退出

if ($filename == "") {

//如果没有指定新的文件名

$ext = strrchr($url, ".");

//得到$url的图片格式

if ($ext != ".gif" && $ext != ".jpg"):return false;

endif;

//如果图片格式不为.gif或者.jpg,直接退出

$filename = date("dMYHis") . $ext;

//用天月面时分秒来命名新的文件名

}

ob_start();//打开输出

readfile($url);//输出图片文件

$img = ob_get_contents();//得到浏览器输出

ob_end_clean();//清除输出并关闭

$size = strlen($img);//得到图片大小

$fp2 = @fopen($filename, "a");

fwrite($fp2, $img);//向当前目录写入图片文件,并重新命名

fclose($fp2);

return $filename;//返回新的文件名

}

$img = GrabImage("//www.jb51.net /6648d73db0edd1e89f3d62f7.jpg", "");

if ($img):echo '<pre><img src="' . $img . '"></pre>';

//如果返回值为真,这显示已经采集到服务器上的图片

else:echo "false";

endif;

//否则,输出采集失败

?>

方法3:PHP下载远程图片

function downFile($url,$filename){
$ch = curl_init ();
curl_setopt ( $ch, CURLOPT_CUSTOMREQUEST, 'GET' );
curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, false );
curl_setopt ( $ch, CURLOPT_URL, $url );
ob_start ();
curl_exec ( $ch );
$return_content = ob_get_contents ();
ob_end_clean ();
$return_code = curl_getinfo ( $ch, CURLINFO_HTTP_CODE );
$fp=@fopen($filename,"a"); //将文件绑定到流
if($fp){
fwrite($fp,$return_content); //写入文件}
return $filename;
}else{
return '';
}

方法4:本地抓取远程图片资源

<?php
function getImage($url,$filename)
{
    # 1 若是图片资源地址为空,则无需往下进行
    if($url == ""){
        return false;
    }
    # 2 获取资源文件的后缀名且判断是否为合法资源
    if($filename === ""){
        $ext_name = strrchr($url, '.');
        if($ext_name != '.jpg' && $ext_name != '.tmp' && $ext_name != '.gif' && $ext_name != '.png'){
            return false;
        }
        # 将资源文件重新命名
        $filename = time() . $ext_name;
    }
    # 3 打开输出控制缓冲
    ob_start();
    readfile($url);
    $img_data = ob_get_contents();
    ob_end_clean();
    # 4 处理获取到的图片信息
    $size = strlen($img_data);
    $local_file = fopen($filename,'a');
    fwrite($local_file, $img_data);
    fclose($local_file);
    return $filename;
}
$url = 'http://www.offcn.com/statics/images/zgIT_wb.jpg';
# 调用获取图片
$res = getImage($url,"");
if($res){
    echo '<script type="text/javascript">alert("图片已扣下来");</script>';   
    return;
}else{
    echo '<script type="text/javascript">alert("图片扒拉不到");</script>';
    return;
}
?>

file_get_contents函数也经常用来获取远程文件内容,包括下载图片,不过有时候file_get_contents有时候会返回为空或函数不可用。

附:file_get_contents返回为空或函数不可用的解决方案

function file_get_content($url) {
if (function_exists(‘file_get_contents')) {
$file_contents = @file_get_contents($url);
}
if ($file_contents == ") {
$ch = curl_init();
$timeout = 30;
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$file_contents = curl_exec($ch);
curl_close($ch);
}
return $file_contents;
}

发表评论 【登录·注册】

所有留言都会被审核,请勿发布垃圾评论!

(必填)*