php获取远程图片的两种 CURL方式和sockets方式获取远程图片


Posted in PHP onNovember 07, 2011

方式1:sockets

$a = "http://3water.com/content/uploadfile/201106/thum-f3ccdd27d2000e3f9255a7e3e2c4880020110622095243.jpg"; 
$local = 'socket1.gif'; 
$aa = getImg($a,$local); 
/* 
*@ 完整的图片地址 
*@ 要存储的文件名 
*/ 
function getImg( $url = "", $filename = "" ) { 
if(is_dir(basename($filename))) { 
echo "The Dir was not exits"; 
Return false; 
} 
//去除URL连接上面可能的引号 
$url = preg_replace( '/(?:^[\'"]+|[\'"\/]+$)/', '', $url ); 
if (!extension_loaded('sockets')) return false; 
//获取url各相关信息 
preg_match( '/http:\/\/([^\/\:]+(\:\d{1,5})?)(.*)/i', $url, $matches ); 
if (!$matches) return false; 
$sock = socket_create( AF_INET, SOCK_STREAM, SOL_TCP ); 
if ( !@socket_connect( $sock, $matches[1], $matches[2] ? substr($matches[2], 1 ) : 80 ) ) { 
return false; 
} 
//图片的相对地址 
$msg = 'GET ' . $matches[3] . " HTTP/1.1\r\n"; 
//主机名称 
$msg .= 'Host: ' . $matches[1] . "\r\n"; 
$msg .= 'Connection: Close' . "\r\n\r\n"; 
socket_write( $sock, $msg ); 
$bin = ''; 
while ( $tmp = socket_read( $sock, 10 ) ) { 
$bin .= $tmp; 
$tmp = ''; 
} 
$bin = explode("\r\n\r\n", $bin); 
$img = $bin[1]; 
$h = fopen( $filename, 'wb' ); 
$res = fwrite( $h, $img ) === false ? false : true; 
@socket_close( $sock ); 
Return $res; 
}

方式2:curl
<?php 
$url = "http://3water.com/content/uploadfile/201106/thum-f3ccdd27d2000e3f9255a7e3e2c4880020110622095243.jpg"; 
$filename = 'curl.gif'; 
//http://3water.com 
getImg($url, $filename); 
/* 
*@通过curl方式获取制定的图片到本地 
*@ 完整的图片地址 
*@ 要存储的文件名 
*/ 
function getImg($url = "", $filename = "") { 
if(is_dir(basename($filename))) { 
echo "The Dir was not exits"; 
Return false; 
} 
//去除URL连接上面可能的引号 
$url = preg_replace( '/(?:^[\'"]+|[\'"\/]+$)/', '', $url ); 
$hander = curl_init(); 
$fp = fopen($filename,'wb'); 
curl_setopt($hander,CURLOPT_URL,$url); 
curl_setopt($hander,CURLOPT_FILE,$fp); 
curl_setopt($hander,CURLOPT_HEADER,0); 
curl_setopt($hander,CURLOPT_FOLLOWLOCATION,1); 
//curl_setopt($hander,CURLOPT_RETURNTRANSFER,false);//以数据流的方式返回数据,当为false是直接显示出来 
curl_setopt($hander,CURLOPT_TIMEOUT,60); 
/*$options = array( 
CURLOPT_URL=> 'http://3water.com/content/uploadfile/201106/thum-f3ccdd27d2000e3f9255a7e3e2c4880020110622095243.jpg', 
CURLOPT_FILE => $fp, 
CURLOPT_HEADER => 0, 
CURLOPT_FOLLOWLOCATION => 1, 
CURLOPT_TIMEOUT => 60 
); 
curl_setopt_array($hander, $options); 
*/ 
curl_exec($hander); 
curl_close($hander); 
fclose($fp); 
Return true; 
} 
?>
PHP 相关文章推荐
PHP 文件上传进度条的两种实现方法的代码
Nov 25 PHP
PHP 截取字符串函数整理(支持gb2312和utf-8)
Feb 16 PHP
php图片加中文水印实现代码分享
Oct 31 PHP
PHP里8个鲜为人知的安全函数分析
Dec 09 PHP
nginx+thinkphp下解决不支持pathinfo模式
Jul 01 PHP
10个值得深思的PHP面试题
Nov 14 PHP
PHP封装函数实现生成随机的字符串验证码
Jan 24 PHP
谈谈从phpinfo中能获取哪些值得注意的信息
Mar 28 PHP
PHP JWT初识及其简单示例
Oct 10 PHP
PHP实现的操作数组类库定义与用法示例
May 24 PHP
PHP进阶学习之反射基本概念与用法分析
Jun 18 PHP
php面向对象基础详解【星际争霸游戏案例】
Jan 23 PHP
php数组函数序列之array_pop() - 删除数组中的最后一个元素
Nov 07 #PHP
php数组函数序列之array_slice() - 在数组中根据条件取出一段值,并返回
Nov 07 #PHP
php数组函数序列之array_unshift() 在数组开头插入一个或多个元素
Nov 07 #PHP
php数组函数序列之array_flip() 将数组键名与值对调
Nov 07 #PHP
php数组函数序列之array_push() 数组尾部添加一个或多个元素(入栈),返回新长度。
Nov 07 #PHP
php数组函数序列之array_splice() - 在数组任意位置插入元素
Nov 07 #PHP
php数组函数序列之in_array() - 查找数组中是否存在指定值
Nov 07 #PHP
You might like
fleaphp rolesNameField bug解决方法
2011/04/23 PHP
解析php下载远程图片函数 可伪造来路
2013/06/25 PHP
php安全配置记录和常见错误梳理(总结)
2017/03/28 PHP
PHP简单实现二维数组赋值与遍历功能示例
2017/10/19 PHP
微信公众号开发之获取位置信息php代码
2018/06/13 PHP
PHP-FPM 的管理和配置详解
2019/02/17 PHP
让回调函数 showResponse 也带上参数的代码
2007/08/13 Javascript
Microsoft Ajax Minifier 压缩javascript的方法
2010/03/05 Javascript
jQuery创建插件的代码分析
2011/04/14 Javascript
wap图片滚动特效无css3元素纯js脚本编写
2014/08/22 Javascript
jQuery获得包含margin的outerWidth和outerHeight的方法
2015/03/25 Javascript
AngularJS Toaster使用详解
2017/02/24 Javascript
原生javascript AJAX 三级联动的实现代码
2018/05/04 Javascript
详解vue-cli 本地开发mock数据使用方法
2018/05/29 Javascript
element-ui的回调函数Events的用法详解
2018/10/16 Javascript
用Vue.js方法创建模板并使用多个模板合成
2019/06/28 Javascript
vue封装swiper代码实例解析
2019/10/08 Javascript
Javascript摸拟自由落体与上抛运动原理与实现方法详解
2020/04/08 Javascript
Node.js API详解之 dgram模块用法实例分析
2020/06/05 Javascript
[48:21]Mski vs VGJ.S Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
Python学习笔记之os模块使用总结
2014/11/03 Python
答题辅助python代码实现
2018/01/16 Python
Python实现string字符串连接的方法总结【8种方式】
2018/07/06 Python
【python】matplotlib动态显示详解
2019/04/11 Python
Django中从mysql数据库中获取数据传到echarts方式
2020/04/07 Python
Python figure参数及subplot子图绘制代码
2020/04/18 Python
浅析Python 序列化与反序列化
2020/08/05 Python
Python包资源下载路径报404解决方案
2020/11/05 Python
澳大利亚音乐商店:Bava’s Music City
2019/05/05 全球购物
某公司.Net方向面试题
2014/04/24 面试题
国际政治个人自荐信范文
2013/11/26 职场文书
技术总监管理岗位职责
2014/03/09 职场文书
商场消防安全责任书
2014/07/29 职场文书
招标承诺书
2014/08/30 职场文书
县委党的群众路线教育实践活动工作情况报告
2014/10/25 职场文书
Spring Data JPA使用JPQL与原生SQL进行查询的操作
2021/06/15 Java/Android