如何在PHP中获取base64编码字符串的文件扩展名?
在我的情况下,这个文件恰好是一个图像文件:
$base64_encoded_string = $_POST['image_base64_string'];
$extension = ??
如何从 $base64_encoded_string
中获取文件扩展名?
编辑:这不是上传表单的一部分,因此不能在此处使用
$_FILES
数据。
如何在PHP中获取base64编码字符串的文件扩展名?
在我的情况下,这个文件恰好是一个图像文件:
$base64_encoded_string = $_POST['image_base64_string'];
$extension = ??
如何从 $base64_encoded_string
中获取文件扩展名?
编辑:这不是上传表单的一部分,因此不能在此处使用
$_FILES
数据。
这里有一行代码,灵感来自于@msg的回答:
$extension = explode('/', mime_content_type($base64_encoded_string))[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
该文章介绍了如何在PHP中检测从Base64字符串中提取的图像类型。这可以通过使用getimagesizefromstring函数和base64_decode函数来实现。使用getimagesizefromstring函数获取图像的MIME类型以及宽度和高度,并根据返回的MIME类型确定图像的类型。//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;
mime_content_type
或等效方法运行它,并猜测类型。mime_content_type
。 - Mystical正则表达式可以从Base64头中提取图像类型:
┌───┐
$b64 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII";
preg_match("/\/(.*?);/", $b64, $MATCH);
↑ ↑
└─────┘ RETURNS STRING BETWEEN / AND ;
echo $MATCH[1];
它应该显示png
。
请注意,斜杠必须转义为\/
,而分号则不需要。
$base64Uri = "data:text/csv;base64,iVBORw0KGgoAAAANSUhEUgAAAF.......";
preg_match('/^data:(.*);base64/', $base64Uri, $match);
$mimeType = $match[1];
$extension = \Symfony\Component\Mime\MimeTypes::getDefault()->getExtensions($mimeType)[0];
mime_content_type
函数需要一个文件名作为参数,所以这让我感到困惑。 - msg$finfo = new \finfo(FILEINFO_MIME_TYPE); $mimeType = $finfo->buffer($file_content);我从以下回复中获得了它: https://dev59.com/unA75IYBdhLWcg3waIMJ - Wak