获取base64编码字符串的文件扩展名

18

如何在PHP中获取base64编码字符串的文件扩展名?

在我的情况下,这个文件恰好是一个图像文件:

$base64_encoded_string = $_POST['image_base64_string'];

$extension = ??

如何从 $base64_encoded_string 中获取文件扩展名?

编辑:这不是上传表单的一部分,因此不能在此处使用$_FILES数据。

6个回答

29

这里有一行代码,灵感来自于@msg的回答:

$extension = explode('/', mime_content_type($base64_encoded_string))[1];

1
mime_content_type 函数需要一个文件名作为参数,所以这让我感到困惑。 - msg
2
根据我从代码中得到的结果,显然_base64_数据被视为文件名。 - Mystical
适用于我。谢谢 - Christopher Kikoti
但是...在这段代码后面加上扩展名'data:image/png;base64'是不可靠的,对吧?@Mystical - gumuruh
在这里,您可以找到一种获取类似于“application/pdf”的内容的方法。但是,您必须首先使用解码来获取二进制数据,然后使用finfo和buffer:$file_content = base64_decode($base64EncodedString, true);
$finfo = new \finfo(FILEINFO_MIME_TYPE); $mimeType = $finfo->buffer($file_content);我从以下回复中获得了它: https://dev59.com/unA75IYBdhLWcg3waIMJ
- Wak

3

这对我有效

function getBytesFromHexString($hexdata)
{
  for($count = 0; $count < strlen($hexdata); $count+=2)
    $bytes[] = chr(hexdec(substr($hexdata, $count, 2)));

  return implode($bytes);
}

function getImageMimeType($imagedata)
{
  $imagemimetypes = array( 
    "jpeg" => "FFD8", 
    "png" => "89504E470D0A1A0A", 
    "gif" => "474946",
    "bmp" => "424D", 
    "tiff" => "4949",
    "tiff" => "4D4D"
  );

  foreach ($imagemimetypes as $mime => $hexbytes)
  {
    $bytes = getBytesFromHexString($hexbytes);
    if (substr($imagedata, 0, strlen($bytes)) == $bytes)
      return $mime;
  }

  return NULL;
}

$encoded_string = "....";
$imgdata = base64_decode($encoded_string);
$mimetype = getImageMimeType($imgdata);

来源:https://newbedev.com/detecting-image-type-from-base64-string-in-php

该文章介绍了如何在PHP中检测从Base64字符串中提取的图像类型。这可以通过使用getimagesizefromstring函数和base64_decode函数来实现。使用getimagesizefromstring函数获取图像的MIME类型以及宽度和高度,并根据返回的MIME类型确定图像的类型。

2
//This function return the extension from mimetype
function getImageMimeType(string $encodedImage)
{
    $decodedImage = base64_decode($encodedImage);
    return (explode('/', finfo_buffer(finfo_open(), $decodedImage, FILEINFO_MIME_TYPE))[1]);
}
    
$encodedImage = '        ';
$extension = getImageMimeType($encodedImage);
echo $extension;

2
如果这是上传表单的一部分,您可以从$_FILES变量获取有关文件的信息。
如果它是原始字段,则可以对其进行解码并通过mime_content_type或等效方法运行它,并猜测类型。
如果您愿意使用库,可以查看mimeyphp-mimetyper

这不是上传表单的一部分。 - Mystical
对,除非你解码它,否则你需要将其原样运行通过 mime_content_type - Mystical

2

正则表达式可以从Base64头中提取图像类型:

                  ┌───┐
$b64 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII";
preg_match("/\/(.*?);/", $b64, $MATCH);
              ↑     ↑
              └─────┘  RETURNS STRING BETWEEN / AND ;
echo $MATCH[1];

它应该显示png

请注意,斜杠必须转义为\/,而分号则不需要。


0
在我的情况下,当我尝试上传CSV文件时,所有的示例都返回了"plain/text"的MIME类型,从技术上来说是正确的,但在我们尝试查找文件扩展名时是错误的。
最终,我采用了以下解决方案(展示了一些Symfony代码):
$base64Uri = "data:text/csv;base64,iVBORw0KGgoAAAANSUhEUgAAAF.......";
preg_match('/^data:(.*);base64/', $base64Uri, $match);
$mimeType = $match[1];
$extension = \Symfony\Component\Mime\MimeTypes::getDefault()->getExtensions($mimeType)[0];

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