es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Android – La carga de bmp al servidor usando Multipart falla

Estoy intentando subir un archivo bmp al servidor (avatar). Para hacerlo, estoy usando Retrofit y Multipart. Aquí está la parte de Retrofit:

@Multipart
@POST(“api/media/images”)
suspend fun uploadImage(
@Part file: MultipartBody.Part?
): UploadImageResponse

Los usuarios eligen una imagen de la galería y luego la aplicación debe subirla al servidor. Estoy usando Jetpack Compose en esta aplicación. Aquí está mi componente para seleccionar una foto:

@Composable
fun UploadButton(bitmapSelected: MutableState<bitmap?>) {

var imageUri by remember {
    mutableStateOf<uri?>(null)
}

val context = LocalContext.current

val launcher = rememberLauncherForActivityResult(
    contract =
    ActivityResultContracts.GetContent()
) { uri: Uri? ->
    imageUri = uri
}

Column(
    modifier = Modifier
        .width(72.dp),
    horizontalAlignment = Alignment.CenterHorizontally,
    verticalArrangement = Arrangement.Top
) {
    IconButton(
        modifier = Modifier
            .clip(CircleShape)
            .size(48.dp)
            .background(Color.Black),
        onClick = { launcher.launch("image/*") })
    {
        imageUri?.let { it ->
            if (Build.VERSION.SDK_INT < 28) {
                bitmapSelected.value = MediaStore.Images
                    .Media.getBitmap(context.contentResolver, it)

            } else {
                val source = ImageDecoder
                    .createSource(context.contentResolver, it)
                bitmapSelected.value = ImageDecoder.decodeBitmap(source)
                bitmapSelected.value = ImageDecoder.decodeBitmap(source)
            }
            bitmapSelected.value?.let { btm ->
                Image(
                    bitmap = btm.asImageBitmap(),
                    contentDescription = null,
                    modifier = Modifier.size(40.dp),
                    contentScale = ContentScale.Crop
                )
            }
        }
        Spacer(modifier = Modifier.height(PaddingSmall))
    }
    Text(
        textAlign = TextAlign.Center,
        text = stringResource(R.string.upload_profile_photo),
        style = MaterialTheme.typography.body2,
        color = Color.Black
    )
}

}

Como se puede ver, el estado se pasa a la clase componible de la pantalla cuando se usa el bmp seleccionado:

@Composable
fun CreateAccountScreen(
navController: NavController,
viewModel: CreateAccountViewModel = hiltViewModel()
) {

val bitmap = remember {mutableStateOf<bitmap?>(null) }
UploadButton( bitmapSelected = bitmap )
}

Todo funciona muy bien. Puedes elegir una foto y ponerla como avatar. Sin embargo, cuando quiero enviar la foto como Parte al backend así:

fun bitmapToMultipart(imageBitmap: Bitmap): MultipartBody.Part {
val bos = ByteArrayOutputStream()
imageBitmap.compress(Bitmap.CompressFormat.JPEG, 80 /ignored for PNG/, bos)
val bitmapdata = bos.toByteArray()
Log.i(TAG, “bitmapToMultipart: ${Base64.encodeToString(bitmapdata,Base64.NO_WRAP)}”)

val name: RequestBody = bitmapdata.toRequestBody("image/*".toMediaTypeOrNull(), 0, bitmapdata.size)
return MultipartBody.Part.createFormData("file", "avatar", name)

}

Recibo un error del servidor que esto no es una imagen. ¿Qué puede estar mal? ¿Dónde está el problema?</bitmap?></uri?></bitmap?>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema podría estar en la conversión del bitmap seleccionado en un MultipartBody.Part. Específicamente, la codificación o compresión del bitmap puede no estar funcionando como se espera, lo que resulta en que el servidor no reconozca el archivo como una imagen.

    Una cosa a verificar sería la codificación que se está utilizando – en el código proporcionado, parece que se está utilizando la codificación JPEG, pero el servidor puede esperar un tipo de codificación diferente.

    También puede ser útil verificar el tamaño y las dimensiones del bitmap que se está cargando, ya que estos factores podrían afectar cómo reconoce el servidor el archivo.

    En general, probablemente sea necesario realizar una solución de problemas adicional para identificar el causa exacta del problema.

Comments are closed.