【问题标题】:Get image type from base64 encoded src string从 base64 编码的 src 字符串中获取图像类型
【发布时间】:2013-09-06 12:58:38
【问题描述】:

我需要什么

我的图片src是这样的

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

如何提取图像类型,即; jpeg 来自上面给出的 src。我用的是 PHP,图片类型 cacn 也是 png 和 gif。

【问题讨论】:

  • 一点Research
  • 该“研究”中最重要和最缺失的部分是,没有任何地方解释说实际图像是在昏迷之后出现的,base64_decode 不能正确地与逗号之前的部分一起工作

标签: php image


【解决方案1】:

你基本上有两个选择:

  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

【讨论】:

  • 它给出错误 getimagesizefromstring() 期望参数 1 是字符串,给定数组
  • @Developer,修复了它错过了获取结果爆炸函数的索引 1 :)
  • 这两个选项有php错误。使用 php 我无法使用 [1]
  • 你能告诉我你是如何解决这个问题的吗?通过复制和粘贴您的代码@BorisGuéry,我得到了完全相同的错误
  • 选项 2 只是“几乎”但错误。应该是这样的:getimagesizefromstring(base64_decode(explode(",",$data)[1])); “爆炸”必须在base64内而不是相反,你想解码base64之后的“,”。在这个解决方案中写的这种方式只是打破了
【解决方案2】:

测试一下:

<?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?
  • @SagarGuhe definition of substrsubstr($str, $start [, $length])。起点是第六个字符,即在冒号之后(= 5 个字符)。所需的子字符串一直到;,从:(不包括)到;(不包括)的长度是; 的索引减去: 的位置。
【解决方案3】:

这是我制作的方式:

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

【讨论】:

    【解决方案4】:

    我希望这会有所帮助,但正确的做法是。

    $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 文件。

    【讨论】:

      【解决方案5】:
      $encoded_string = "....";
      $imgdata = base64_decode($encoded_string);
      
      $f = finfo_open();
      
      $mime_type = finfo_buffer($f, $imgdata, FILEINFO_MIME_TYPE);    
      

      【讨论】:

      【解决方案6】:

      你可以使用这个,如果你使用 ajax 上传图片,那么你将无法使用 finfo_buffer 获得正确的 MIME

      function getMIMETYPE($base64string){
          preg_match("/^data:(.*);base64/g",$base64string, $match);
          echo $match[1];
      }
      

      【讨论】:

        【解决方案7】:
        $str64 = base64 string
        
        function base64Extension($str64) {
          return explode(";", explode("/", $str64)[1])[0];
        }
        

        【讨论】:

          【解决方案8】:

          使用下面的正则表达式代码,它返回文件的扩展名。

          $base64string = 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAA...';
          preg_match("/^data:image\/(.*);base64/i",$base64string, $match);
          $extension = $match[1];
          

          【讨论】:

            【解决方案9】:
            $str = 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAA...';
            $ext = end(explode('/', (explode(';', $str))[0]));
            

            结果:JPEG

            【讨论】:

              【解决方案10】:

              这个解决方案最适合我,它借鉴了 Boris Guery 提出的选项 1。

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

              在这种情况下,解决方案在 $type 变量中返回 jpeg 文件扩展名。

              【讨论】:

                【解决方案11】:
                String[] strings = base64String.split(",");
                String extension;
                switch (strings[0]) {//check image's extension
                    case "data:image/jpeg;base64":
                        extension = "jpeg";
                        break;
                    case "data:image/png;base64":
                        extension = "png";
                        break;
                    default://should write cases for more images types
                        extension = "jpg";
                        break;
                }
                

                【讨论】:

                  【解决方案12】:

                  $type 将返回 "data:image/jpeg"

                  然后 $extension 返回 "jpeg"

                    $type      = explode(';', $httpFileRequest)[0];
                    $extension = explode('/', $type)[1];
                  

                  【讨论】:

                    【解决方案13】:

                    我就是这样做的:

                    $string = 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAA...';
                    // $string = 'data:video/mp4;base64,/9j/4AAQSkZJRgABAQAAAQABAA...';
                    
                    function getMimeType($string)
                    {
                        $string = explode(
                            ';base64,',
                            stristr($string, ';base64,', true)
                        );
                    
                        if(empty($string[0])){
                            return false;
                        }
                    
                        preg_match('/^data:(.*)\/(.*)/', $string[0], $match);
                    
                        return [
                            'type' => $match[1],
                            'extension' => $match[2],
                        ];
                    }
                    
                    var_dump(
                        getMimeType($string)
                    );
                    // array(2) { ["type"]=> string(5) "image" ["extension"]=> string(4) "jpeg" }
                    // array(2) { ["type"]=> string(5) "video" ["extension"]=> string(3) "mp4" }
                    

                    【讨论】:

                      【解决方案14】:

                      获取base64图像文件类型的最佳方法

                          $type = explode('/', mime_content_type($base64_string))[1];
                      

                      【讨论】:

                        【解决方案15】:

                        它对我有用,它是获取 base64 图像文件类型的最佳方式。它只返回文件扩展名,如“png”、“jpg”等

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

                        返回: jpeg

                        【讨论】:

                          【解决方案16】:

                          这是最适合我的解决方案...

                          $str = "data:image/jpg;base64,R0lGODlhPQBEAPeoAJow==";
                          $name = time() . '.' . explode('/', explode(':', substr($str, 0, strpos(str, ';')))[1])[1];
                          
                          Result: 1564650041.jpg
                          

                          【讨论】:

                            猜你喜欢
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2021-09-22
                            • 1970-01-01
                            • 2015-04-06
                            相关资源
                            最近更新 更多