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