Как загрузить изображение на сервер с помощью модернизации на Android

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

Как я могу это исправить?

URL

Ответ №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.