微信公众平台的用户头像和接口取到的用户上传图片都做了防盗处理,不能被其他网页引用。
例如,下面是在引用用户头像的图片的时候,提示未经允许不可引用。
本文介绍如何下载这些图片的方法!
一、下载图片所有信息
使用CURL的方式下载
返回将返回图片的二进制数据及http头信息
http头如下
二、根据http头做一些过滤
一些明显不符合要求的图片就直接忽略掉,没有必要保存
三、保存图片二进制数据
保存到BAE
保存到SAE
保存到本地
function downloadImageFromQzone($url)
{
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_NOBODY, 0); //只取body头
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$package = curl_exec($ch);
$httpinfo = curl_getinfo($ch);
curl_close($ch);
$imageAll = array_merge(array('imgBody' => $package), $httpinfo);
return $imageAll;
}
["url"]=> string(66)"http://mmsns.qpic.cn/mmsns/L4qjYtOibumlqutvkb6r0V0KCjEJM76NFiawL5tDicOZn9ibKgIaiaUfeRA/0"
["content_type"]=> string(10)"image/jpeg"
["http_code"]=> int(200)
["header_size"]=> int(374)
["request_size"]=> int(258)
["filetime"]=> int(-1)
["ssl_verify_result"]=> int(0)
["redirect_count"]=> int(0)
["total_time"]=> float(0.289523)
["namelookup_time"]=> float(0.002558)
["connect_time"]=> float(0.003475)
["pretransfer_time"]=> float(0.003477)
["size_upload"]=> float(0)
["size_download"]=> float(42240)
["speed_download"]=> float(145895)
["speed_upload"]=> float(0)
["download_content_length"]=> float(42240)
["upload_content_length"]=> float(0)
["starttransfer_time"]=> float(0.241982)
["redirect_time"]=> float(0)
$imageExt = (0 < preg_match('{image/(\w+)}i', $imageAll["content_type"], $extmatches))? $extmatches[1]: "jpeg";
if (preg_match('{(jpg|jpeg|png)$}i', $imageExt) == 0){ //非jpg,jpeg,png格式
$contentStr = "不支持类型";
}else if ($imageAll["download_content_length"]/1024 > 200){ //大于200K
$contentStr = "图片太大";
}else if ($imageAll["total_time"] > 1){ //大于1秒
$contentStr = "网速太慢";
}
$fileUpload = $imageAll["imgBody"];
require_once (dirname( __FILE__ ). '/bcs/bcs.class.php');
$host = 'bcs.duapp.com';
$ak = '';
$sk = '';
$bucket = '';
$filename = time ();
$object = '/images/'.$filename.'.jpg';
$baiduBCS = new BaiduBCS ( $ak, $sk, $host );
$opt = array("acl" => "public-read");
$response = $baiduBCS->create_object_by_content( $bucket, $object, $fileUpload, $opt );
if (isset($_SERVER['HTTP_APPNAME'])){
//SAE环境
$s = new SaeStorage();
$s->write($domain, $filename, $imageAll["imgBody"]);
}
//本地操作
$local_file = fopen($filename, 'w');
if (false !== $local_file){
if (false !== fwrite($local_file, $imageAll["imgBody"])) {
fclose($local_file);
}
}