0

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

它适用于大多数图像,例如,

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

但它不适用于来自 Victoria's Secret 等网站的图片,例如:

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 返回“Resource ID #11”,但对于像 Victoria's Secret 这样不成功的链接,$handle 什么也不返回。

此外,exif_imagetype 没有为图像返回任何内容(我们安装了 exif 扩展)。

有什么解决方法吗?我们正在构建一个书签,允许用户从网站中提取图片。我们注意到其他小书签能够绕过这个问题(即 Pinterest)并且能够从 Victoria's Secret 获取图片。

4

2 回答 2

1

由于 .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 信息正确且相同。

于 2013-08-06T22:24:43.837 回答
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');

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

于 2013-08-06T17:18:05.577 回答