我正在使用fopen来检查图像文件是否存在(以及从外部URL中提取图像的前身)。
对大多数图像来说,它工作得很好,例如,
SY300.jpg“> HTTP://ecx.images-amazon.com/images/I/51DbiFInDUL SY300 .JPG
。但它不适用于像维多利亚的秘密这样的网站的图像,例如:
http://dm.victoriassecret.com/product/428x571/V360249.jpg
这是权限问题吗?如果是这样,有什么工作吗?
$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)并能够从维多利亚的秘密中获取图片。
答案 0 :(得分:1)
由于.htaccess文件中定义的热链接保护,它不显示数据。您需要将数据作为客户端获取。我试过你可以使用CURL,如果你把用户代理的HTTP头信息读取内容并保存到文件。
在我的解决方案中,您的问题已经解决。
注意:请注意在标题中使用的远程服务器上的文件类型,有一个示例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下载的图像与orignal相同我在victoriasecret服务器上的原始图像和使用CURL下载的md5sum之间进行了检查。但是,结果是SAME,IDENTICAL,因此您可以抓取并分析下载的数据以供将来使用...如果您不再需要,也可以删除。
在Linux平台上,您可以使用 md5sum 以md5结果的总和来测试相同的文件:
md5sum V360249.jpg V360249_original.jpg
893a47cbf0b4fbe4d1e49d9d4480b31d V360249.jpg
893a47cbf0b4fbe4d1e49d9d4480b31d V360249_original.jpg
结果相同,您可以确定exif_imagetype信息正确且相同。
答案 1 :(得分:0)
通过删除@符号,我能够得到更有意义的错误:
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中类似,没有设置其他选项。我会假设这与cookie或其他未设置的设置有关,但我没有直接的答案。希望这有点帮助。
[已编辑 - 基于评论的解决方案] 因此,如果您还设置了用户代理,那么在这种情况下使用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');
请参阅this link了解如何在curl中设置用户代理。