如何使用PHP中的file_get_contents获取图像的MIME类型

23

我需要获取一张图片的 MIME 类型,但是我只有通过file_get_contents获取到的图片内容。有没有可能获取到这个 MIME 类型呢?


1
可能是一个重复问题,关于如何在使用file_get_contents从远程服务器获取文件后获取文件的MIME类型。链接 - miken32
3个回答

54

是的,你可以这样获取它。

$file_info = new finfo(FILEINFO_MIME_TYPE);
$mime_type = $file_info->buffer(file_get_contents($image_url));
echo $mime_type;

1
使用 $file->buffer 时要小心,它可能会占用大量内存。对于一个18MB的文件,PHP峰值达到了220MB(在调用 ->buffer之前为50MB)!我不得不使用 put_file_contents 然后 mime_content_type。 - Jean-Charles LUC
它对我不起作用,我传递的URL是https://youtu.be/ZqFCn4Nia4o,它显示给我文本/ HTML。 - Rakhi

9
如果你使用HTTP下载文件,请不要猜测(也就是自动检测)MIME类型。即使你使用了file_get_contents下载了文件,你仍然可以访问HTTP头。
使用$http_response_header来检索最后一个file_get_contents调用(或任何使用http[s]:// wrapper的调用)的头部信息。
$contents = file_get_contents("https://www.example.com/image.jpg");
$headers = implode("\n", $http_response_header);
if (preg_match_all("/^content-type\s*:\s*(.*)$/mi", $headers, $matches)) {
    $content_type = end($matches[1]);
    echo "Content-Type is '$content_type'\n";
}

只有在服务器未提供 Content-Type(或只提供了通用的捕获所有类型,例如 application/octet-stream)时才应该使用自动检测。

1
马丁干得好! - Răducanu Ionuţ

6
非常小心,仅通过检查Mime类型来确定文件类型!如果您真的想确保图像是实际的图像,则最安全的方法是使用图像操作库打开它并将其写入该库。这样做既可以防止图像实际上是恶意代码,又可以保证您实际上正在将图像文件写入磁盘。例如,您可以轻松地欺骗MIME以认为某些恶意代码是GIF。

更直接地回答您的问题,请使用FileInfo PECL模块


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接