Загрузка изображения с помощью Multipart с 3 параметрами данных формы в Android - PullRequest
0 голосов
/ 20 апреля 2020

Я пытаюсь отправить изображение на сервер, используя составные данные с 3 параметрами, но у меня возникла проблема с загрузкой изображения, он правильно находит путь к изображению, но не загружает его на сервер.

Я не знаю, что мне не хватает кода ниже.

Метод вложения отправки

@JvmSuppressWildcards
@Headers("Content-Type: application/x-www-form-urlencoded")
@Multipart
@POST("messages/send_media_message")
fun sendAttachment(
    @PartMap() formData: Map<String, RequestBody>,
    @Part avatar: MultipartBody.Part
): Call<SendAttachment>

fun getPath(uri: Uri?): String? {
    val projection =
        arrayOf(MediaStore.Images.Media.DATA)
    val cursor = contentResolver.query(uri, projection, null, null, null) ?: return null
    val column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA)
    cursor.moveToFirst()
    val s = cursor.getString(column_index)
    cursor.close()
    return s
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)

    if (requestCode == PICK_IMAGE && data != null) {
        val imageUri = data.data
        Log.d("kb uri", "" + imageUri)
        if (imageUri != null) {

            val file = File(getPath(imageUri))
            Log.d("kb file", "" + file)

            val requestFile = file.asRequestBody("multipart/form-data".toMediaTypeOrNull())
            val body = MultipartBody.Part.createFormData("media_file", file.name, requestFile)
            val token: String? = mPref.getAccessToken()

            val accessToken = token?.toRequestBody(MultipartBody.FORM)
            val toUserId = toUserId.toString().toRequestBody(MultipartBody.FORM)

            val map: HashMap<String, RequestBody> = HashMap()
            if (accessToken != null) {
                map.put("access_token", accessToken)
                map.put("to_userid", toUserId)
            }

            mChatPresenter.sendAttachmentPresenter(map, body)
        }
    }
}

Вызов API

override fun sendAttachMent(
    formData: HashMap<String, RequestBody>,
    attachment: MultipartBody.Part,
    listner: ChatInteractor.onChatListner
) {
    ApiHelper().sendAttachment(formData, attachment)
        .enqueue(object : Callback<SendAttachment> {
            override fun onFailure(call: Call<SendAttachment>, t: Throwable) {
                listner.onFailure(t.localizedMessage)
            }

            override fun onResponse(
                call: Call<SendAttachment>,
                response: Response<SendAttachment>
            ) {

                if (response.isSuccessful) {
                    if (response.code() == 200) {
                        listner.onSuccess("success")

                    }
                }
            }
        })
}

Ошибка Я получаю от android studio

java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 112 path $.data

Мой успешный ответ почтальона Это возвращение объекта данных при успехе и массив данных при сбое

{
    "code": 200,
    "message": "",
    "data": {
        "id": 277,
        "from": 116,
        "from_delete": 0,
        "to": 362,
        "to_delete": 0,
        "text": "",
        "media": "upload/chat/2020/04/s3EWmQSCFZVdSLtRGqnT_m.jpg",
        "sticker": "",
        "seen": 0,
        "created_at": "2020-04-20 12:10:26",
        "message_type": "media"
    },
    "hash_id": "9f635156d3e9bd3840493b742027da6f65c2b92a85d76e41464e4",
    "errors": {
        "error_id": "",
        "error_text": ""
    }
}
...