【问题标题】:Get the file extension of a base64 encoded string获取base64编码字符串的文件扩展名
【发布时间】:2025-12-03 16:05:01
【问题描述】:

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

在我的例子中,这个文件恰好是一个图像

$base64_encoded_string = $_POST['image_base64_string'];

$extension = ??

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

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

【问题讨论】:

    标签: php base64 file-extension


    【解决方案1】:

    这对我有用

    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】:

      这是受 @msg 的 回答启发的单行代码:

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

      【讨论】:

      • mime_content_type 需要一个文件名,所以这让我很困惑
      • 显然,根据我从代码中得到的结果,base64 数据被视为文件名。
      • 为我工作。谢谢
      • 但是... 'data:image/png;base64' 代码后面的扩展是不可靠的,对吧? @神秘的
      【解决方案3】:

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

      如果它是一个原始字段,您可以对其进行解码并通过mime_content_type 或等效项运行它并进行猜测。

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

      【讨论】:

      • 不过,它不是上传表单的一部分。
      • 对,除非你不解码,你通过mime_content_typeraw运行它。