Guarde la image base64encoded en la database del server como BLOB

Estoy tomando una fotografía desde mi aplicación de Android usando este código:

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); } 

Estoy enviando este String encodedImage a mi server PHP a través de POST y lo recibo en $encodedImage . Tengo una database donde tengo un campo myImage de tipo MEDIUMBLOB . Intenté save la image encodedimage en myImage pero se guardó como image dañada. Traté de save como base64_decode($encodedImage) pero de alguna manera eso tampoco funcionó.

Quiero tres cosas por hacer:

  • Guardar image en la database del server (BLOB)

  • Mostrar image en una página web

  • Envíalo de vuelta a la aplicación de Android.

Estoy enfrentando problemas para comprender la conversión de la image requerida en diferentes formattings para las tareas anteriores.

Para mi proyecto actual, no quiero save mi image en una carpeta y dar un enlace a la database, por lo que esa opción está cerrada para mí.

Mi código PHP para save la image:

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

Prefijo su SQL con la palabra key _binary "

 $query = "INSERT INTO `complaints` (`myImage`,...) VALUES (_binary'".addcslashes($blobImage, "\x00\'\"\r\n")."',...)" 

Además, configure un entorno de testing con CURL para que pueda arrojar imágenes codificadas en base64 repetidamente. Este va a ser un caso en el que necesita mucha debugging.

 <?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); 

Y luego usa curl para publicarlo repetidamente y depurar tu PHP

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

Ajuste su script PHP para simplemente escribir los datos en un file en su disco duro e inspeccionarlo allí. Escriba múltiples versiones, codificadas y decodificadas.

Personalmente, no basaría los bytes que iban de Android a PHP, pero los codificaría en base64 en mysql.

No decodifique su image en PHP, guárdela como la recibe. Ahora, en la interfaz, puede imprimir la image de la siguiente manera

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