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;
}