Я пытаюсь отправить изображение на сервер, используя составные данные с 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": ""
}
}