【问题标题】:How to get MIME-type of an image with file_get_contents in PHP如何在 PHP 中使用 file_get_contents 获取图像的 MIME 类型
【发布时间】:2014-10-03 22:00:18
【问题描述】:

我需要获取图像的 MIME 类型,但我只有通过 file_get_contents 获得的图像主体。是否有可能获得 MIME 类型?

【问题讨论】:

标签: php http mime-types file-get-contents content-type


【解决方案1】:

是的,你可以这样得到它。

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

【讨论】:

  • 小心使用 $file->buffer 它会占用大量内存。对于 18 MB 的文件,PHP 的峰值为 220 MB(调用 ->buffer 之前为 50 MB)!我不得不 put_file_contents 然后 mime_content_type
【解决方案2】:

要非常小心,只检查 Mime 类型!如果您真的想确定图像实际上是图像,最安全的方法是使用图像处理库打开它并使用该库编写它。如果图像实际上是恶意代码,这将失败并保证您实际上正在将图像文件写入磁盘。举个例子,你可以很容易地欺骗 MIME 认为某些恶意代码是 GIF。

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

【讨论】:

    【解决方案3】:

    如果您使用 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");
    $pattern = "/^content-type\s*:\s*(.*)$/i";
    if (($header = array_values(preg_grep($pattern, $http_response_header))) &&
        (preg_match($pattern, $header[0], $match) !== false))
    {
        $content_type = $match[1];
        echo "Content-Type is '$content_type'\n";
    }
    

    【讨论】:

    • 马丁干得好!
    猜你喜欢
    • 2013-10-04
    • 2011-04-11
    • 2017-02-12
    • 2015-04-27
    • 2011-06-07
    • 2014-06-10
    • 2011-03-12
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多