将base64_encode映像从数据库恢复到文件系统

时间:2012-03-16 16:32:47

标签: php mysql image filesystems

我使用base64_encode将一些图片保存到mysql数据库中。 现在我想将它们还原回文件系统。

我该怎么做?

编辑...!

好的,我没有解释清楚。

我使用此代码对我的图像进行编码并将其保存到blob表中:

function base64_encode_image ($imagefile) {
$imgtype = array('jpg', 'gif', 'png');
$filename = file_exists($imagefile) ? htmlentities($imagefile) : die('Image file name does not exist');
$filetype = pathinfo($filename, PATHINFO_EXTENSION);
if (in_array($filetype, $imgtype)){
    $imgbinary = fread(fopen($filename, "r"), filesize($filename));
} else {
    die ('Invalid image type, jpg, gif, and png is only allowed');
}
return 'data:image/' . $filetype . ';base64,' . base64_encode($imgbinary);
}

并使用此代码在浏览器中显示我的图片:

if (!isset($_GET['id']) && !ctype_digit($_GET['id'])){
    die('Error');
} else {
    require_once( addslashes(dirname(dirname(__FILE__)) . '/config.php') );
    require_once( addslashes(dirname(__FILE__) . '/Functions.php'));
    $row = mysql_fetch_array(mysql_query ("SELECT `id`,`cover_small` FROM `om_manga` WHERE `Active` = '1' AND `id` = '".sql_quote($_GET['id'])."'"));
    if (isset($row['id'])){
        header("Content-type: image/jpeg");
        readfile($row['cover_small']);
    } else {
        die('Error');
    }
}

现在我希望他们回到jpg文件。

所有这些图像的大小都小于3kb。

2 个答案:

答案 0 :(得分:3)

使用PHP的base64_decode()函数将编码数据转换回二进制文件。

由于base64_decode返回一个字符串,您可以使用file_put_contents()将已解码的内容写入文件。

这让我想知道为什么你要存储图像base64编码,如果你没有以那种格式使用它。您可以轻松地将图像以二进制格式存储在二进制blob列中。

Base64编码增加了33%的字符开销(而不是字节)。

编辑修改后的问题

你的第二个问题的答案是主观的,没有背景。在不知道系统细节的情况下,我不建议您是否应该提取图像。

答案 1 :(得分:2)

以与编码相同的方式对其进行解码...
base64_decode()

您可能希望在将图像写入数据库时​​存储图像的文件扩展名,以便您可以准确地还原它。只需将新名称与现有扩展名连接即可。 你应该这样的东西是这样的:

// Retrieved values from database
$encodedImg = $sqlResult['encoded_img'];
$ext = $sqlResult['encoded_img_ext'];

// Concatenate new file name with existing extention
// NOTE : This parameter is a full path.  Make sure that the folder 
// you are writing the file to has the correct permissions allowing the
// script write access.
$newImagePath = "/some/path/on/the/servers/filesystem/";
$newImageName = $newImagePath."decoded_image.".$ext;

// Saving the decoded file with the new file name.
file_put_contents($newImageName, base64_decode($encodedImg));