从base64编码的src字符串中获取图像类型

23

我需要什么

我的图像来源看起来像这样

data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAA...

我如何从上面给出的src中提取图像类型,例如jpeg?我正在使用PHP,图像类型也可以是png/gif/jpg。


2
一点研究 - Patsy Issa
1
这个“研究”中最重要且缺失的部分是没有解释实际图像是逗号后面的部分,base64_decode将无法正确处理逗号前面的部分。 - Cesc
16个回答

27

你基本上有两个选择:

  1. 相信元数据
  2. 直接检查图像源的类型

选择1:

可能是更快的方法,因为它只涉及字符串分割,但可能不正确。 类似于:

$data = 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAA.';
$pos  = strpos($data, ';');
$type = explode(':', substr($data, 0, $pos))[1];

选项2:

使用getimagesize()函数及其字符串等效函数:

$info = getimagesizefromstring(explode(',', base64_decode($data)[1], 2));
// $info['mime']; contains the mimetype

1
它报错了,getimagesizefromstring() 函数期望参数 1 是字符串,但实际传递的是数组。 - Developer
@开发者,已修复漏掉获取结果 explode 函数中索引 1 的问题 :) - Boris Guéry
这两个选项都有 PHP 错误。使用 PHP 我不能使用 [1]。 - Gino
你能告诉我你是如何确切地修复这个问题的吗? 我通过复制粘贴你的代码@BorisGuéry得到了完全相同的错误。 - user3531149
1
选项2只是“几乎”,但是是错误的。它应该像这样:getimagesizefromstring(base64_decode(explode(",",$data)[1])); “explode”必须在base64内部而不是相反,您想要解码逗号后面的base64。以这种方式在此解决方案中编写会导致错误。 - Cesc
显示剩余4条评论

10

测试这个:

<?php

$str = 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAA...';

function getB64Type($str) {
    // $str should start with 'data:' (= 5 characters long!)
    return substr($str, 5, strpos($str, ';')-5);
}
var_dump(getB64Type($str));

为什么这里要减去5? - Sagar Guhe
@SagarGuhe substr 的定义substr($str, $start [, $length])。起始点是第六个字符,即冒号后面(= 5个字符)。所需的子字符串一直到 ;,长度为:(不包括)到;(不包括)之间的索引,就是;位置减去 : 位置。 - ComFreek

8
我希望这能有所帮助,但正确的做法是:
$uri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAF......."
$encodedImgString = explode(',', $uri, 2)[1];
$decodedImgString = base64_decode($encodedImgString);
$info = getimagesizefromstring($decodedImgString);

echo $info['mime'];

请不要仅使用 data:image/png,因为它并不可靠,我很容易伪造这部分并向您发送一个base64编码的.exe文件。


7
这是我的做法:

我是这样做的:

$uri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAF......."
$img = explode(',', $uri);
$ini =substr($img[0], 11);
$type = explode(';', $ini);
echo $type[0]; // result png

4
$encoded_string = "....";
$imgdata = base64_decode($encoded_string);

$f = finfo_open();

$mime_type = finfo_buffer($f, $imgdata, FILEINFO_MIME_TYPE);    

3
请添加解释。 - OhBeWise
1
他无法解释,因为他是从这里 https://dev59.com/hG025IYBdhLWcg3wW0kc 复制了答案。 - Jhourlad Estrella

4
如果您使用ajax上传图片,则无法通过finfo_buffer获取正确的MIME。您可以使用以下方法:
function getMIMETYPE($base64string){
    preg_match("/^data:(.*);base64/g",$base64string, $match);
    echo $match[1];
}

3
$str64 = base64 string

function base64Extension($str64) {
  return explode(";", explode("/", $str64)[1])[0];
}

2
$str = 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAA...';
$ext = end(explode('/', (explode(';', $str))[0]));

结果:jpeg


2
使用以下正则表达式代码,它返回文件的扩展名。
$base64string = 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAA...';
preg_match("/^data:image\/(.*);base64/i",$base64string, $match);
$extension = $match[1];

0

这对我很有效,也是获取base64图像文件类型的最佳方法。它只返回文件扩展名,如'png'、'jpg'等。

$photo = data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAA...
$ext = explode('/',explode(':',substr($photo,0,strpos($photo,';')))[1])[1];

返回:jpeg


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