如何在 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
如果这是上传表单的一部分,您可以从 $_FILES 变量获取有关文件的信息。
mime_content_type
或等效项运行它并进行猜测。
如果您愿意使用库,您可以查看 mimey 或 php-mimetyper。
//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;
Regex 可以从 base64 标头中提取图像类型:
┌───┐
$b64 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII";
preg_match("/\/(.*?);/", $b64, $MATCH);
↑ ↑
└─────┘ RETURNS STRING BETWEEN / AND ;
echo $MATCH[1];
它应该显示
png
。
注意斜杠必须转义
\/
,而分号则不需要转义。
就我而言,当我尝试上传 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];