【问题标题】:Save base64encoded image to server-side database as BLOB将base64encoded图像作为BLOB保存到服务器端数据库
【发布时间】:2016-07-02 10:02:36
【问题描述】:

我正在使用此代码从我的 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);

【问题讨论】:

  • 您是否尝试过mysqli_real_escape_string() 或为它准备的语句,使用mysqli_ 或PDO?应该可以的。
  • php + mysql 对我来说是新的,所以我必须先用谷歌搜索。我一定会去找的。​​span>
  • 您是否在将编码图像存储到数据库之前对其进行了测试?
  • 因为您确实标记为 mysql,所以您认为您将使用 mysqli_ 作为您的 API。如果您使用mysql_ 进行连接,请使用mysql_real_escape_string()。这对我们来说是未知的。当保存为 BLOB 时,您绝对必须转义进入 mysql 的数据。
  • @HalayemAnis 不,我没有。我本来想但没想到,因为我是通过电话发送的。

标签: php android mysql sql


【解决方案1】:

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

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

【讨论】:

  • 你的意思是为了节省,我应该删除行 $blobImage = base64_decode($baseImage); 。休息好吗?
  • @SrujanBarai 是的 :) 你测试了吗?
  • 我确实是这样保存的。然后我去了我的数据库。 myImage 字段向我展示了图像。我点击下载它。但是保存到电脑后是空白图片,扩展名为.bin
  • @SrujanBarai 我们必须保持清洁,如果您有新问题,您应该创建一个新线程,我很乐意为您提供帮助 :)
  • 这不是一个新问题。这只是同样的问题没有以这种方式解决。但我正在努力。更大的问题是,我是 php 和 sql 的新手,稍微研究一下,你的提示应该会有所帮助。我正在努力。
【解决方案2】:

在您的 SQL 前加上关键字 _binary"

$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 的字节进行 base64 处理,但我会在 mysql 中对它们进行 base64 编码。

【讨论】:

  • 如果您不使用base64字节,那么您希望如何传输?我很容易在 Android 端进行任何更改。对于 php 的新手来说,您的回答有点沉重。 :\
  • 只需通过 http 发送原始字节。您可以 base64 编码,唯一的缺点是增加了有效负载大小,这不是一个严重的问题。 stackoverflow.com/questions/6360207/…
  • 在php中接收Bytes会不会更合适更容易处理?
  • 不。您可以将它们作为 $_FILES 全局数组中的文件访问,就像您有一个网页提交上传一样。通常,在满足限制之前,您只需要传输一些 X% 大的文件,其中 X 是将二进制转换为 base64 的开销。
  • 两者都做,如果设置了数组键 $_POST['b64Image'],然后处理数据就好像它是 base64 编码的,如果设置了 $_POST['rawImage'] 然后处理那些字节作为原始 JPEG。然后只需从客户端发送您想要的任何内容。
猜你喜欢
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 2017-03-19
  • 1970-01-01
  • 1970-01-01
  • 2017-06-30
  • 2013-12-05
  • 2017-10-22
相关资源
最近更新 更多