将base64encoded映像保存为服务器端数据库BLOB

时间:2016-03-16 13:30:24

标签: php android mysql sql

我正在使用此代码 Android应用中拍摄照片:

if (requestCode == CAMERA_REQUEST && resultCode == RESULT_OK){
        photo = (Bitmap) data.getExtras().get("data");
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        photo.compress(Bitmap.CompressFormat.JPEG, 40, baos);
        byte[] photoByte = baos.toByteArray();
        encodedImage = Base64.encodeToString(photoByte,Base64.DEFAULT);
    }

我通过POST将此字符串encodedImage发送到我的PHP服务器并将其接收到$encodedImage。我有一个数据库,其中我有myImage类型的字段MEDIUMBLOB。我尝试将encodedimage保存在myImage中,但会将其另存为损坏的图像。我试图保存为base64_decode($encodedImage),但不知何故,它也没有用。

我想要做三件事:

  • 将图像保存到服务器端数据库(BLOB)

  • 将图片显示到网页

  • 将其发回Android应用。

我正面临着了解上述任务所需的不同格式的图片转换的问题。

对于我当前的项目,我不想将我的图像保存到文件夹并提供数据库链接,因此该选项对我来说是关闭的。

我保存图片的PHP代码:

$baseImage = $_POST['baseImage'];
$blobImage = base64_decode($baseImage);
$query = "INSERT INTO `complaints`(`myImage`,...) VALUES ('$blobImage',...)"
$result = mysqli_query($conn,$query);

2 个答案:

答案 0 :(得分:3)

不要在PHP中解码图像,在收到图像时将其存储, 现在,在前端,您可以按照以下方式打印图像

<?php
    $img = '<img src="data:image/jpeg;base64,' . $encodedImgStoredInDB . '">';
    print $img;
?>

答案 1 :(得分:1)

使用关键字_binary&#34;

为SQL添加前缀
$query = "INSERT INTO `complaints`
(`myImage`,...)
VALUES (_binary'".addcslashes($blobImage, "\x00\'\"\r\n")."',...)"

此外,使用CURL设置测试环境,以便您可以重复抛出base64编码的图像。这将是您需要大量调试的情况。

<?php
$f = fopen('sample.jpg.base64.txt', 'w');
$i = fopen('sample.jpg', 'r');
if (!$i) { die("cannot open sample.jpg\n"); } 
$bytes = '';
while ( ! feof($i)) { 
    $bytes .= fread($i, 4096);
}
fclose($i);
fputs($f, base64_encode( $bytes ) );
fclose($f);

然后使用curl重复发布并调试PHP

curl -X PUT "http://localhost/myimport.php" -F "baseImage=@./sample.jpg.base64.txt"

调整PHP脚本,只需将数据写入硬盘驱动器上的文件并在那里进行检查。写出多个版本,包括编码和解码。

就个人而言,我不会将从Android到PHP的字节数为64,但我 base64在mysql中对它们进行编码。