来自 url src 的 PHP 图像返回 403 错误和应用程序/八位字节流


PHP Image from url src returns 403 error and application/octet-stream

当我遇到以前从未有过的东西时,从网址中提取图像。标头检查返回了 403 错误,尽管图像扩展被列为.jpg但它们作为应用程序/八位字节流返回,并且检查内容类型返回文本/html。

我已经阅读了403"通常"是为了防止屏幕报废,但这只是在图像上。

我觉得很奇怪,我可以查看网页的源代码,看到图像 src,然后单击它并将图像返回到浏览器,但不是通过代码。

有没有办法将图像网址转换为实际图像?我最终想从图像中提取高度、宽度、尺寸信息,并将它们保存到服务器上的文件夹中。

$html = file_get_contents($url);
$doc = new DOMDocument();
$doc->loadHTML($html);
$tags = $doc->getElementsByTagName('img');
foreach ($tags as $tag){
$image_src = $tag->getAttribute('src');
echo get_headers($image_src, 1); //returns a 403 Forbidden Error
echo image_type_to_mime_type(exif_imagetype($image_src)); //returns application/octet-stream
$i = getimagesize($image_src);
var_dump($i); //returns bool(false)
$c = curl_init();
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
curl_setopt($c, CURLOPT_CUSTOMREQUEST, 'HEAD');
curl_setopt($c, CURLOPT_HEADER, 1);
curl_setopt($c, CURLOPT_NOBODY, true);
curl_setopt($c, CURLOPT_URL, $image_src);
curl_exec($c);
echo $content_type = curl_getinfo($c, CURLINFO_CONTENT_TYPE); //returns text/html
}

根据我的经验,当您期望拥有 MIME 类型的图像/jpeg、图像/png 等时,处理获取应用程序/八位字节流的图像是由于脚本无法正确处理图像,由于不正确的 PHP 配置。(例如,图像大于最大文件上传或帖子大小会给出八位字节流的 MIME(

在 url 上使用 file_get_contents((,您需要确保启用allow_url_fopen,以便允许 fopen 获取 URL 的内容,就好像它是本地文件一样。(PHP INI allow_url_fopen(

或者,看看使用 cURL 下载 url 并从那里开始(查看此答案以获取执行此操作的方法(。尝试配置更改和 cURL 过程,看看它们是否产生相同的结果。

但是,您收到403错误的事实听起来像是远程端的内容,不允许您通过特定请求检索图像。正如您正确识别的那样,这可能是停止抓取的安全尝试。您是否尝试过使用其他网站或您控制的服务器来获取图像?

希望这里的东西对:)有所帮助