Guardar la imagen de base64encoded a la base de datos del servidor como BLOB
Estoy tomando una fotografía desde mi aplicación de Android con 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 esta String encodedImage
a mi servidor PHP a través de POST y lo recibo a $encodedImage
. Tengo una base de datos donde tengo un campo myImage
del tipo MEDIUMBLOB
. He intentado guardar la imagen encodedimage
en myImage
pero se guarda como imagen dañada. Intenté ahorrar como base64_decode($encodedImage)
pero de alguna manera eso no trabajó tampoco.
- El contenido de Android contentprovider lleva mucho tiempo
- Problema con la base de datos SQL en la aplicación PhoneGap que se ejecuta en el iPhone
- SQLite SUM y LIMIT no parecen funcionar juntos
- ¿Es mejor pasar los datos por intención o consultar la base de datos cuando sea necesario?
- Error de Android sql al usar SUM
Quiero que se hagan tres cosas:
-
Guardar imagen en la base de datos del servidor (BLOB)
-
Mostrar imagen a una página web
-
Envíela de vuelta a la aplicación de Android.
Estoy haciendo frente a problemas en la comprensión de la conversión de la imagen requerida en diversos formatos para las tareas antedichas.
Para mi proyecto actual, no quiero guardar mi imagen en la carpeta y dar enlace a la base de datos, por lo que la opción está cerrada para mí.
Mi código PHP para guardar la imagen:
$baseImage = $_POST['baseImage']; $blobImage = base64_decode($baseImage); $query = "INSERT INTO `complaints`(`myImage`,...) VALUES ('$blobImage',...)" $result = mysqli_query($conn,$query);
- Cómo sincronizar Android Database con un servidor SQL en línea?
- Alcanzó el tamaño MAX para la caché de instrucciones compiladas-sql para la base de datos
- Atascado con diseño de SQL android utilizando SQLite y Group By
- Realm.io Query con GroupBy
- SQLite de Android - Clave principal - Insertar en la tabla
- Recuperar el último registro en la tabla SQLite (de nuevo)
- ¿Cuál es la forma correcta de hacer inserciones / actualizaciones / eliminaciones en Android SQLiteDatabase utilizando una cadena de consulta?
- Uso de una biblioteca / marco de compilador de consultas SQL con Android
Prefijo de SQL con la palabra clave _binary "
$query = "INSERT INTO `complaints` (`myImage`,...) VALUES (_binary'".addcslashes($blobImage, "\x00\'\"\r\n")."',...)"
Además, configure un entorno de prueba con CURL para que pueda reproducir imágenes codificadas en base64 repetidamente. Esto va a ser un caso en el que necesita un montón de depuración.
<?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 usar curl para publicarlo repetidamente y depurar su 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 archivo de su disco duro e inspeccionarlo allí. Escriba varias versiones, tanto codificadas como decodificadas.
Personalmente, no base64 los bytes va de Android a PHP, pero yo base64 codificarlos en mysql.
No descodifique su imagen en PHP, guárdela como la reciba, Ahora, en frontend puede imprimir la imagen como sigue
<?php $img = '<img src="data:image/jpeg;base64,' . $encodedImgStoredInDB . '">'; print $img; ?>
- Pasar datos de intención de la actividad a la clase
- Android TextInputLayouts perder texto / contenido al volver en la transacción de fragmentos