Kotlin дооснащение загрузить изображение не найдено - PullRequest
0 голосов
/ 22 января 2019

Я пытаюсь отправить фотографию из галереи, но у меня есть ошибка, указывающая, что изображение не найдено

Запрос даже не отправляется на сервер

Во фрагменте

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (resultCode == Activity.RESULT_OK) {
        when (requestCode) {
            REQUEST_SELECT_IMAGE_IN_ALBUM -> {
                val contentURI = data!!.data
                postServer(contentURI)

            }
        }
    }
}

private fun postServer(contentURI: Uri) {

    val MEDIA_TYPE_IMAGE: MediaType = MediaType.parse("image/*")!!
    val file = File(contentURI.path)
    val requestBody: RequestBody = RequestBody.create(MEDIA_TYPE_IMAGE, file)
    mercrediViewModel.uploadImage(enfant, requestBody)
}

В моей модели

fun uploadImage(enfant: Enfant, requestBody: RequestBody) {
    viewModelScope.launch {

        val request = mercrediService.uploadImage("****", enfant.id, requestBody)
        request.enqueue(object : Callback<ResponseBody> {
            override fun onFailure(call: Call<ResponseBody>, t: Throwable) {
                Timber.i(" error image" + t)
            }

            override fun onResponse(call: Call<ResponseBody>, response: Response<ResponseBody>) {
                Timber.i(" response image" + response.body())
            }

        })
    }
}

И сервис дооснащения

@Multipart
@POST("api/update/enfant/photo/{id}")
fun uploadImage(
    @Header("X-AUTH-TOKEN") token: String?,
    @Path("id") id: Int,
    @Part("image") image: RequestBody
): Call<ResponseBody>

У меня есть эта ошибка

хорошо, спасибо, я изменил это сообщение об ошибкето же самое:

I / MercrediViewModel $ uploadImage: ошибка zeze image java.io.FileNotFoundException: / document / image: 74 (нет такого файла или каталога) в java.io.FileInputStream.open (собственный метод)at java.io.FileInputStreamJava: 173) на okhttp3.MultipartBody.writeTo (MultipartBody.java:114) .....

Спасибо

1 Ответ

0 голосов
/ 31 января 2019

Наконец-то мое решение

class FileHelper {

fun createFile(realPath: String): File {
    return File(realPath)
}

fun createRequestBody(file: File): RequestBody {
    val MEDIA_TYPE_IMAGE: MediaType = MediaType.parse("image/*")!!
    return RequestBody.create(MEDIA_TYPE_IMAGE, file)
}

fun createPart(file: File, requestBody: RequestBody): MultipartBody.Part {
    return MultipartBody.Part.createFormData("image", file.name, requestBody)
}

fun getPathFromURI(context: Context, uri: Uri): String? {
    val path: String = uri.path
    var realPath: String? = null

    val databaseUri: Uri
    val selection: String?
    val selectionArgs: Array<String>?
    if (path.contains("/document/image:")) { // files selected from "Documents"
        databaseUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
        selection = "_id=?"
        selectionArgs = arrayOf(DocumentsContract.getDocumentId(uri).split(":")[1])
    } else { // files selected from all other sources, especially on Samsung devices
        databaseUri = uri
        selection = null
        selectionArgs = null
    }
    try {
        val projection = arrayOf(
            MediaStore.Images.Media.DATA,
            MediaStore.Images.Media._ID,
            MediaStore.Images.Media.ORIENTATION,
            MediaStore.Images.Media.DATE_TAKEN
        ) // some example data you can query
        val cursor = context.contentResolver.query(
            databaseUri,
            projection, selection, selectionArgs, null
        )
        if (cursor.moveToFirst()) {
            val columnIndex = cursor.getColumnIndex(projection[0])
            realPath = cursor.getString(columnIndex)
        }
        cursor.close()
    } catch (e: Exception) {
        Timber.i("zeze get path error " + e.message)
    }
    return realPath
}

}

@Multipart
@POST("api/update/enfant/photo/{id}")
fun uploadImage(
    @Path("id") enfantId: Int,
    @Part file: MultipartBody.Part,
    @Part("image") requestBody: RequestBody): Call<ResponseBody>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...