Php fopen适用于某些URL,但不适用于其他URL

Php fopen适用于某些URL,但不适用于其他URL,php,fopen,Php,Fopen,我使用fopen检查图像文件的存在性(并作为从外部url提取图像的前兆) 例如,对于大多数图像来说,它工作得非常好 SY300.jpg“>http://ecx.images-amazon.com/images/I/51DbiFInDUL.SY300.jpg 但它不适用于维多利亚秘密(Victoria’s Secret)等网站的图像,例如: 这是一个权限问题吗?如果是,有什么解决办法吗 $url = "http://dm.victoriassecret.com/product/428x571/V

我使用fopen检查图像文件的存在性(并作为从外部url提取图像的前兆)

例如,对于大多数图像来说,它工作得非常好

SY300.jpg“>http://ecx.images-amazon.com/images/I/51DbiFInDUL.SY300.jpg

但它不适用于维多利亚秘密(Victoria’s Secret)等网站的图像,例如:

这是一个权限问题吗?如果是,有什么解决办法吗

$url = "http://dm.victoriassecret.com/product/428x571/V360249.jpg";
$handle = @fopen($url,'r');
if($handle !== false){
return true;
}
对于成功的链接,$handle返回“资源ID#11”,但对于失败的链接,如Victoria's Secret,$handle不返回任何内容

此外,exif_imagetype不会为图像返回任何内容(我们已经安装了exif扩展)


有什么解决办法吗?我们正在构建一个允许用户从站点提取图片的书签小程序。我们注意到其他书签小程序可以解决这个问题(即Pinterest),并且可以从维多利亚的秘密中获取图片。

通过删除@符号,我可以得到一个更有意义的错误:

Warning: fopen(http://dm.victoriassecret.com/product/428x571/V360249.jpg) [function.fopen]: failed to open stream: HTTP request failed! in [removedSomedatahere]/test.php on line 5
它在curl、wget和fopen中也有类似的功能,没有设置其他选项。我假设这与cookies或其他未设置的设置有关,但我没有直接的答案。希望这对您有所帮助

[已编辑-基于评论的解决方案] 因此,如果还设置了用户代理,那么在这种情况下使用curl可能是一个更好的选择。网站是基于用户代理进行阻止的。因此,解决方案是将常用浏览器设置为代理

以下是设置用户代理的示例:

curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');

请参阅以了解如何在curl中设置用户代理。

由于.htaccess文件中定义了热链接保护,因此不会显示数据。您需要作为客户端获取数据。我尝试过,如果您将用户代理读取内容的HTTP头信息放入并保存到文件中,则可以使用curl

在我的解决方案中,你的问题得到了解决

注意:请注意,对于在标头中使用的远程服务器上的文件类型,有一个示例GIF文件
image/GIF
,因此您可以为PNG添加另一个文件类型示例

有效解决方案示例:

error_reporting(E_ALL);
ini_set('display_errors', '1');

$url = "http://dm.victoriassecret.com/product/428x571/V360249.jpg";

function getimg($url) {         
    $headers[] = 'Accept: image/gif, image/x-bitmap, image/jpeg, image/pjpeg';              
    $headers[] = 'Connection: Keep-Alive';         
    $headers[] = 'Content-type: application/x-www-form-urlencoded;charset=UTF-8';         
    $user_agent = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)';         
    $process = curl_init($url);         
    curl_setopt($process, CURLOPT_HTTPHEADER, $headers);         
    curl_setopt($process, CURLOPT_HEADER, 0);         
    curl_setopt($process, CURLOPT_USERAGENT, $user_agent);         
    curl_setopt($process, CURLOPT_TIMEOUT, 30);         
    curl_setopt($process, CURLOPT_RETURNTRANSFER, 1);         
    curl_setopt($process, CURLOPT_FOLLOWLOCATION, 1);         
    $return = curl_exec($process);         
    curl_close($process);         
    return $return;     
} 

$imgurl = $url; 
$imagename= basename($imgurl);
if(file_exists($imagename)){continue;} 
$image = getimg($imgurl); 
file_put_contents($imagename,$image);
注意:如果您在Linux文件系统上,请确保根文件夹是可写的(CHMOD),否则将不会在路径中保存文件

所以你们谈论的是EXIF数据,以及CURL下载的图像如何与原始图像相同?我已经用md5sum检查了victoriasecret服务器上的原始图像和使用CURL下载的图像之间的差异。但是,结果是相同的,相同的,所以你们可以抓取和分析下载的数据以备将来使用……如果你们不再需要,可以删除

在Linux平台上,您可以使用md5sum按md5结果之和测试相同的文件:

md5sum V360249.jpg V360249_original.jpg
893a47cbf0b4fbe4d1e49d9d4480b31d  V360249.jpg
893a47cbf0b4fbe4d1e49d9d4480b31d  V360249_original.jpg

结果是相同的,您可以确保exif_imagetype信息正确且相同。

您能用您如何使用
fopen
的代码片段进行更新吗?我知道,对于IIS服务,IIS服务器用户必须拥有打开该文件的权限。例如,如果victorias IIS没有打开/创建/编辑的权限。。。维多利亚秘密服务器不允许您使用。除IIS以外的其他服务也可能如此。(遗憾的是,我现在没有想到这一点)他说的不是IIS,我也不确定他使用的是哪个操作系统。谢谢你的回答。我尝试了一些使用的测试,但这并不表明映像受热链接保护。有一种解决方案,称为user agent和CURL。