我正在尝试从PHP中获取并显示来自URL的远程图像。大多数图像都有效,但有些图像重定向,例如:
http://thundafunda.com/33/World-tour/download/Grand%20Canal,%20Venice,%20Italy%20pictures.jpg
图像会加载然后消失。我正在使用IMG标记并将该URL作为源。有什么想法吗?
答案 0 :(得分:2)
使用这部分代码,除了显示<img>
标记外,它不会执行任何操作:
$url = 'http://thundafunda.com/33/World-tour/download/Grand%20Canal,%20Venice,%20Italy%20pictures.jpg';
echo '<img src="' . $url . '" alt="" />';
我得到了您描述的相同行为:图片未显示。
如果我看一下网络级别上发生的事情,使用Firebug,我看到了:
http://extern.pascal-martin.fr/so/5264918.png
基本上:
302
HTTP状态代码Location
标题中指定的网址 - 指向HTML网页当然,这不能在<img>
标记中显示。
如果您执行完全相同的测试,禁用Referer
(某些Firefox扩展程序可以执行此操作),您将看到图像正确显示 - 和Firebug说:
http://extern.pascal-martin.fr/so/5264918-2.png
请注意,这次,我的浏览器发送的请求中没有Referer标头。
考虑到这一点,我敢打赌,有一种反热链接保护,这是由托管该图像的网站设置的......
除了在您自己的服务器上托管文件外,您无能为力 - 如果许可证允许您这样做。
答案 1 :(得分:1)
服务器可能会阻止图像的热链接,可能是基于引荐来源。有很多方法可以解决这个问题,例如使用curl(如果安装在服务器上):
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://thundafunda.com/33/World-tour/download/Grand%20Canal,%20Venice,%20Italy%20pictures.jpg');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_REFERER, 'http://thundafunda.com/');
$imageData = curl_exec($ch);
header("Pragma: public"); // required
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false); // required for certain browsers
header("Content-Type: image/jpg");
header("Content-Transfer-Encoding: binary");
echo $imageData;
<强>声明:强>
他们可能不喜欢图像的热链接,否则他们不会首先集成他们的解决方案。更好地要求他们使用他们的图像的权限,否则可能会侵犯他们的版权