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

问题描述 投票:0回答:6

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

就我而言,这个文件恰好是一个图像

$base64_encoded_string = $_POST['image_base64_string'];

$extension = ??

如何从

$base64_encoded_string
获取文件扩展名?

编辑:这不是上传表单的一部分,因此

$_FILES
数据不能在此处使用。

php base64 file-extension
6个回答
29
投票

这是一句受 @msg 答案启发的一句话:

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

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


2
投票

如果这是上传表单的一部分,您可以从 $_FILES 变量获取有关文件的信息。

如果它是原始字段,您可以对其进行解码并通过

mime_content_type
或等效项运行它并进行猜测。

如果您愿意使用库,您可以查看 mimeyphp-mimetyper


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
投票

Regex 可以从 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];
© www.soinside.com 2019 - 2024. All rights reserved.