最近刚好遇到一个需要将图像 base64 数据转换成文件的功能,为了方便我直接用 chatGPT 生成功能函数就拿来直接用,结果反复测试了几次图片文件无法正常查看。chatGPT 生成的代码如下:
<?php
// 原始的 base64 数据
$base64Data = '/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAIAAgADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQ';
// 去掉 base64 数据中的文件类型信息
$base64Data = str_replace('data:image/jpeg;base64,', '', $base64Data);
// 将 base64 数据解码
$imageData = base64_decode($base64Data);
// 检查是否解码成功
if ($imageData !== false) {
// 写入文件
$filename = 'image.jpg';
file_put_contents($filename, $imageData);
echo '文件写入成功!';
} else {
echo '无法解码 base64 数据!';
}
?>
思考问题出在哪儿? 平时使用 file_put_contents() 函数多是用来写日志或缓存文件,它写入文件的数据是字符串、数组或其他可序列化的数据,而实例中的图像 base64 数据 去除文件类型信息后,base64 解码后是二进制数据。
更深层的原因以我现在的知识解决不了。接下来的代码才是能正常使用的。
要使用PHP代码将图像的Base64数据转换为图片文件,您可以使用以下代码示例:
<?php
/**
* 将图像 base64 数据转换成 文件
* @param $base64Data
* @param $outputFile
* @return mixed
*/
function base64_to_image($base64_data, $file_path) {
// 去掉 base64 数据中的文件类型信息
$base64Data = str_replace('data:image/jpeg;base64,', '', $base64Data);
$base64Data = str_replace('data:image/png;base64,', '', $base64Data);
// 将base64数据解码为图像数据
$image_data = base64_decode($base64_data);
// 创建输出文件
$file = fopen($file_path, 'wb');
// 将图像数据写入文件
$bytes_written = fwrite($file, $image_data);
// 关闭文件
fclose($file);
if($bytes_written !== false){
return true;
}else{
return false;
}
}
// 示例用法
$base64_data = "这里替换为您的Base64数据";
$file_path = "这里替换为您想要保存图片的文件路径";
base64_to_image($base64_data, $file_path);
这段代码实现了将Base64编码的图像数据转换为图像文件的功能。以下是代码的步骤解释:
- 首先,传入两个参数:
$base64Dat
a(Base64编码的图像数据)和$outputFile
(输出文件路径)。 - 使用
str_replace
函数去掉$base64Data
中的文件类型信息,将'image/jpeg;base64,'
和'image/png;base64,'
替换为空字符串,得到纯净的Base64数据。 - 使用
base64_decode
函数将纯净的Base64数据解码为图像数据。 - 使用
fopen
函数创建一个以二进制写入模式打开的文件句柄$file
,用于写入图像数据。 - 使用fwrite函数将图像数据写入文件。
- 使用
fclose
函数关闭文件句柄。 - 成功返回
true
, 失败返回false
.
扩展:
图像文件类型信息有哪些?
常见的图像文件类型信息包括:
- JPEG(.jpg、.jpeg):一种常用的有损压缩格式,适用于存储照片和彩色图像。
- PNG(.png):一种无损压缩格式,适用于存储图标、透明图像和图形等。
- GIF(.gif):一种支持动画的图像格式,适用于简单的动画和图形。
- BMP(.bmp):一种无压缩的图像格式,适用于存储原始图像数据。
- TIFF(.tiff、.tif):一种多页和高质量图像格式,适用于印刷和出版等领域。
- SVG(.svg):一种矢量图像格式,适用于网页和可缩放图形。
- WEBP(.webp):一种谷歌开发的图像格式,具有较高的压缩率和图像质量。
- ICO(.ico):一种用于存储图标的文件格式,常用于Windows操作系统。
这只是一些常见的图像文件类型,还有其他少见或特定用途的图像文件类型。
使用 file_put_contents() 将解码后图像的二进制数据写入文件,这样得来的图像文件无法正常查看。使用 fwrite() 写入文件操作后的图片文件是正常的,请分析下原因
如果使用 file_put_contents()
函数将解码后的图像二进制数据直接写入文件,有时候可能会导致无法正常查看的问题。这可能是由于 file_put_contents()
函数默认以文本模式写入数据,导致在写入过程中进行了一些文本处理,从而导致图像数据损坏。
相比之下,使用 fwrite()
函数进行二进制写入操作可以避免这个问题。fwrite()
函数以二进制模式将数据直接写入文件,不会进行额外的文本处理,因此适用于写入图像数据。
以下是使用 fwrite()
函数进行图像数据写入的示例代码:
<?php
// 原始的 base64 数据
$base64Data = '/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAIAAgADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQ';
// 去掉 base64 数据中的文件类型信息
$base64Data = str_replace('data:image/jpeg;base64,', '', $base64Data);
// 将 base64 数据解码
$imageData = base64_decode($base64Data);
// 检查是否解码成功
if ($imageData !== false) {
// 写入文件
$filename = 'image.jpg';
$fileHandle = fopen($filename, 'wb'); // 以二进制模式打开文件
if ($fileHandle !== false) {
fwrite($fileHandle, $imageData);
fclose($fileHandle);
echo '文件写入成功!';
} else {
echo '无法打开文件!';
}
} else {
echo '无法解码 base64 数据!';
}
?>
在这个示例中,我们使用 fopen()
函数以二进制模式打开文件,并将返回的文件句柄传递给 fwrite()
函数进行写入操作。最后,记得使用 fclose()
函数关闭文件句柄。
使用 fwrite()
函数进行二进制写入操作可以确保图像数据不会被误处理,从而生成正常的图像文件。
原文链接: https://baijiahao.baidu.com/builder/preview/s?id=1769990005390742652