从另一台服务器

问题描述:

说抓取的图像,在这个例子中,这是一个图像:这是对网站A.从另一台服务器

我打电话这个图像转换成B网站与<img>标签托管http://www.basitansari.com/wp-content/uploads/logoaba.png。如果网站A的所有者删除了这张图片,那我怎么知道图片已经被PHP删除?如果网站A的所有者删除了图片,我想要显示一张notfound.jpg图片。我应该为此目的使用cURL还是其他?

if (!$fp = fopen('http://www.basitansari.com/wp-content/uploads/logoaba.png', 'r')) { 
    // The image cannot be retrieved, handle it here. 
} else { 
    fclose($fp); 
} 

这是最快的方法,因为它只是检查图像是否可以成功检索,并不下载整个文件。

+0

如果图像是100s megs,该怎么办?为什么他只是为了知道它是否在那里?有更好的方法来做到这一点。看到我的回答 – Zepplock 2012-01-28 00:03:59

+0

@Zepplock这不会传输整个图像。试试看。它只发送请求,读取头并让套接字准备好接收数据 - 只要确认文件是否可访问,“fopen()”调用就会返回。当然,这是'HEAD'方法应该做的,但是这样做需要(稍微)更多的代码,并且要求服务器正确地处理HEAD,这总是有可能不会。这只是初始化一个'GET',确认它是否会起作用,然后返回。 – DaveRandom 2012-01-28 00:09:41

+0

谢谢@DaveRandom它正在工作:) – 2012-01-28 00:12:26

你应该叫与HEAD方法URL,并检查状态代码404(未找到)或200(OK)

+0

感谢您的回答,我现在正在尝试这种方法。 – 2012-01-28 00:21:34

您可以直接拨打:检查是否存在图像源使用的fopen,如果没有显示notfound.jpg 。 @用于禁止警告

<img src="<?php if (@fopen("http://www.basitansari.com/wp-content/uploads/logoaba.png", "r")) {echo 'http://www.basitansari.com/wp-content/uploads/logoaba.png';} else{echo 'notfound.jpg';}?>" /> 

检查服务器端图像是绝对有可能的,但它可能不是最好的解决方案。这样做意味着所有有效的图像将被加载两次(服务器端和客户端一次)。更好的方法可能是使用JavaScript来处理破碎的图像。以下代码只会在加载图像时发生错误时采取措施,并将其替换为您指定的图像:

<script type="text/javascript"> 
function brokenImage(obj) { 
    obj.onerror = ''; 
    obj.src = 'path/to/notfound.jpg'; 
    return true; 
} 
</script> 
<img onerror="brokenImage(this);" src="broken.jpg" alt="" />