Сохранить base64encoded изображение на серверную базу данных как BLOB

Я делаю фотографию из своего приложения для 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); } 

Я отправляю этот String encodedImage на свой PHP-сервер через POST и $encodedImage его в $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); 

Префикс вашего 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-скрипт, чтобы просто записать данные в файл на вашем жестком диске и проверить его там. Выписывайте несколько версий, как закодированных, так и декодированных.

Лично я бы не base64 байты, идущие от Android к PHP, но я бы base64 их кодировал в mysql.

Не расшифровывайте свой образ на PHP, сохраняйте его по мере его получения. Теперь, в интерфейсе, вы можете распечатать изображение, как показано ниже.

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