Loading...

如何通过php获取别的服务器上的图片

2007-09-08 09:59:53 发表于PHP, 网站技术 本文链接: 如何通过php获取别的服务器上的图片

目前本站FB订阅图标的显示服务申请已经停止,但是作为一个负责的男人,我会一直保留以前的申请的图标继续显示的,除非不可抗拒的因素产生,俗话说,授人鱼不如授人以渔,所以对于虚拟主机abroad的兄弟,下面的这段代码或许对你有用。当然啊,你也别担心麻烦,后面会提供源代码的下载和使用方法

< ?php
$feedburner_image ="http://feeds.feedburner.com/~fc/storydaycom?bg=99CCFF&fg=444444&anim=0";//图片的路径
header("Content-type: image/gif");
//
//下面的两个函数来自php.net
//函数的作用是利用socks获取http内容
//
function httpSocketConnection($host, $method, $path, $data)
{
$method = strtoupper($method);

if ($method == "GET")
{
$path.= '?'.$data;
}

$filePointer = fsockopen($host, 80, $errorNumber, $errorString);

if (!$filePointer)
{
return false;
}

$requestHeader = $method." ".$path." HTTP/1.1\r\n";
$requestHeader.= "Host: ".$host."\r\n";
$requestHeader.= "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20061010 Firefox/2.0\r\n";
$requestHeader.= "Content-Type: application/x-www-form-urlencoded\r\n";

if ($method == "POST")
{
$requestHeader.= "Content-Length: ".strlen($data)."\r\n";
}

$requestHeader.= "Connection: close\r\n\r\n";

if ($method == "POST")
{
$requestHeader.= $data;
}

fwrite($filePointer, $requestHeader);

$responseHeader = '';
$responseContent = '';

do
{
$responseHeader.= fread($filePointer, 1);
}
while (!preg_match('/\\r\\n\\r\\n$/', $responseHeader));

if (!strstr($responseHeader, "Transfer-Encoding: chunked"))
{
while (!feof($filePointer))
{
$responseContent.= fgets($filePointer, 128);
}
}
else
{

while ($chunk_length = hexdec(fgets($filePointer)))
{
$responseContentChunk = '';
$read_length = 0;

while ($read_length < $chunk_length)
{
$responseContentChunk .= fread($filePointer, $chunk_length - $read_length);
$read_length = strlen($responseContentChunk);
}

$responseContent.= $responseContentChunk;

fgets($filePointer);

}

}

return chop($responseContent);
}

function parseChunked($response) {

$do = true;
$return = "";
$size = NULL;

while($do) {

// suppress warnings w/ @ if offset not in string (past end)
$pos = @strpos($response, "\r\n", 0);

if(!($pos === false) && $size === NULL) {

// we found CRLF, get len from hex
$size = hexdec(substr($response, 0, $pos));

// get the actual chunk-len, reset $response, $size
$return .= substr($response, $pos+2, $size);
$response = substr($response, ($pos+2) + $size);
$size = NULL;
}
else {
$do = false;
} // end if/else

} // end while

return $return;
} // end function parseChunked()

$http_get_path = str_replace("http://feeds.feedburner.com","",$feedburner_image );
require "date.php";//存放上次获取图标的时间
if( date('YmdH') - $lastupdate > 4 ) {
//如果相距上次获取图标的时间超过了4小时
//则更新图标
//reload the image every 4 hours

$phpstr = "";
$contents = httpSocketConnection('feeds.feedburner.com', "GET", $http_get_path, $qString);
//write image file
//将图标写入文件中
$fp =fopen( "feedburner.gif" ,"w+" );
fwrite($fp , $contents);
fclose($fp);
//同时更新本次获取图标的时间
$fp =fopen( "date.php" ,"w+" );
$datecontent = "< ?php \$lastupdate = ".date('YmdH').";\n ?>";
fwrite($fp , $datecontent);
fclose($fp);
die($contents);
}
readfile("feedburner.gif");
?>

代码在这里
fb.zip
请将fb.php用记事本打开,修改顶部$feedburner_image 的路径为你要转发图片的路径
然后将其他两个文件的属性设置成0666,最后在需要引用图片的地方引用fb.php的路径即可。

利用同样的原理大家也可以轻松的解决ajax http的跨域处理问题,不明白这一行在说什么的,忽略这一行。

该日志未加标签
发表于 2007-09-08 09:59:53 目录:PHP, 网站技术 [RSS 2.0] 你可以发表评论, 或者从您的网站 trackback
  • 相关阅读
  • homezz 美国专业主机商
    feed url
    上一篇: « 新闻时间
    已经有2位大师动手指导 拒绝低俗
    • 1楼 Jake 在2007.09.09 22:33发表评论如下: 回复

      看不懂。高手。

      • 2楼 istef 在2007.09.15 18:10发表评论如下: 回复

        我用的是 libcurl,只写了几行就可以了。而且 libcurl 的效率也不低。另外 bluehost 好像支持 curl 吧。[r]不错,curl是最好的选择,包括以前做缓存的时候都是用的这个东西,但是考虑到n多服务器没有这个lib,也考虑到n多服务器不支持fopen url,所以就用了这个socksopen,反正已经缓存,效率已经无所谓[/r]

        评论分页: 1
        (Required)
        (Required, not published)
        如果留言未显示无需重复留言,我将为你恢复!