#android #kotlin #retrofit #retrofit2
#Android #kotlin #модернизация #retrofit2
Вопрос:
В моем приложении я должен загрузить изображение на сервер.
Для запросов сервера я использовал retrofit 2
Я пишу коды загрузки, но показываю ошибку для проверки и говорю, что поле мультимедиа пустое.
Запрос на загрузку изображения от PostMan: нажмите, чтобы увидеть изображение
В postman все в порядке, никаких проблем, и загрузка изображения прошла успешно!
Но в моем коде покажите мне ошибку проверки!
Мой код интерфейса api :
@Multipart
@POST("media/")
fun uploadImage(
@Header(AUTHORIZATION) auth: String, @Header(ACCEPT) accept: String, @Header(CONTENT_TYPE) contentType: String,
@Part media: MultipartBody.Part
): Single<Response<ResponseModelUploadImage>>
Загрузить код изображения :
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
photoEasy.onActivityResult(
requestCode, resultCode
) { thumbnail ->
val imgFile = bitmapToFile(thumbnail, "myImageNameIsThisTest.jpeg")
Log.e("filePath",imgFile.toString())
val reqFile = RequestBody.create(MediaType.parse("multipart/form-data"), imgFile)
val filePart = MultipartBody.Part.createFormData("media", imgFile?.name, reqFile)
presenter.callUploadImage(userToken, APPLICATION_JSON, APPLICATION_JSON, filePart)
}
}
Как я могу это исправить?
Ответ №1:
Это пример функции загрузки в приложении для Android (в Kotlin), которая отправляет изображение на сервер (в данном случае это веб-приложение, разработанное на Java и Spring Boot) с модификацией в виде составных / форм-данных:
private suspend fun sendPicture(sessionId: UUID, p: Picture): Boolean {
try {
val data_part = p.data.toRequestBody("multipart/form-data".toMediaTypeOrNull())
val data_multi_part =
MultipartBody.Part.createFormData("picture", p.description, data_part)
val sessionId_part =
sessionId.toString().toRequestBody("multipart/form-data".toMediaTypeOrNull())
val id_part = p.id.toString().toRequestBody("multipart/form-data".toMediaTypeOrNull())
val categoryId_part =
p.categoryId?.toString()?.toRequestBody("multipart/form-data".toMediaTypeOrNull())
val response = api.sendPicture(sessionId_part, id_part, categoryId_part, data_multi_part)
if (!response.isSuccessful) {
@Suppress("BlockingMethodInNonBlockingContext")
val msg = response.errorBody()?.string() ?: textHelper(
R.string.error_send_picture,
p.id.toString()
)
Logger.trace(EventCode.SerializationError, msg, EventSeverity.Error)
}
return response.isSuccessful
} catch (e: Exception) {
Logger.trace(p, EventCode.SerializationError, e.localizedMessage, Action.Send, EventSeverity.Exception)
}
return false
}
И сгенерированный API, который использует Retrofit 2.6, объявляется следующим образом:
@Multipart
@POST("SendPicture")
suspend fun sendPicture(@Part("sessionId") sessionId: RequestBody, @Part("pictureId") id: RequestBody, @Part("categoryId") categoryId: RequestBody?, @Part picture: MultipartBody.Part): Response<Void>
Примите во внимание, что Picture
это объект Android Room (ORM), и p.data
это представление изображения в виде массива байтов ( val data: ByteArray
).
sessionId = is a session ID (it's just a custom value of type UUID)
pictureId = is the ID of the picture (type: UUID)
categoryId = is the ID of the category the picture belongs to (type: UUID)
Эти 3 значения являются пользовательскими (они вам не нужны), они существуют только для того, чтобы показать, как передать больше данных на сервер вместе с изображением.
Функция написана на Kotlin.
Я думаю, у вас есть все необходимое для извлечения кода, который лучше соответствует вашим потребностям. Этот пример взят из кода моего проекта, и он был протестирован. Он отправляет изображения, хранящиеся в локальной базе данных, на сервер.
Вы можете легко перенести код на Java.