Как отправить файл любого типа в параметре post в Retrofit 2 Kotlin? - PullRequest
3 голосов
/ 10 июня 2019

Позвольте мне поделиться некоторым кодом, который я реализовал для отправки файла изображения в запросе.

Ниже приведена моя функция запроса API:

@Multipart
@POST("api/order/order_create")
fun createOrder(
    @Header("Authorization") authorization: String?,
    @Part("category_id") categoryId: RequestBody?,
    @Part("size") size: RequestBody?,
    @Part("narration") narration: RequestBody?,
    @Part("ref_picture") file: RequestBody?
): Call<OrderCreateResponse>

Ниже приведен код, где я вызываю API, отправив необходимые параметры:

var fbody = RequestBody.create(MediaType.parse("image/*"), imageFile)
var size = RequestBody.create(MediaType.parse("text/plain"), et_custom_order_size.text.toString())
var catId = RequestBody.create(MediaType.parse("text/plain"), selectedID.toString())
var narration = RequestBody.create(MediaType.parse("text/plain"),et_custom_order_narration.text.toString())

val orderCreateAPI = apiService!!.createOrder(complexPreferences?.getPref("token", null), catId,size,narration,fbody)

Здесь imageFile

imageFile = File(Global.getRealPathFromURI(activity!!, imageUri!!))

Используя функцию ниже, чтобы получить реальный путь,

fun getRealPathFromURI(context: Context, contentUri: Uri): String {
        var cursor: Cursor? = null
        try {
            val proj = arrayOf(MediaStore.Images.Media.DATA)
            cursor = context.contentResolver.query(contentUri, proj, null, null, null)
            val column_index = cursor!!.getColumnIndexOrThrow(MediaStore.Images.Media.DATA)
            cursor.moveToFirst()
            return cursor.getString(column_index)
        } catch (e: Exception) {
            Log.e(TAG, "getRealPathFromURI Exception : " + e.toString())
            return ""
        } finally {
            if (cursor != null) {
                cursor.close()
            }
        }
    }

Отправляя изображение вышеуказанным способом, я не могу его отправить!Пожалуйста, ведите меня с тем же.Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 10 июня 2019
@Multipart
@POST("register")
Observable<SignInResponse> signUp(@Part("name") RequestBody name, @Part MultipartBody.Part fileToUpload);

Затем передайте файл изображения как переменную MultipartBody.Part

// image as file
    var body: MultipartBody.Part? = null
    if (!profileImagePath.isNullOrBlank()) {
        val file = File(profileImagePath)
        val inputStream = contentResolver.openInputStream(Uri.fromFile(file))
        val requestFile = RequestBody.create(MediaType.parse("image/jpeg"), getBytes(inputStream))
        body = MultipartBody.Part.createFormData("image", file.name, requestFile)
        Log.d("nama file e cuk", file.name)
    }

Последнее, что вы можете сделать RequestBody var

RequestBody.create(MediaType.parse("text/plain"), user_full_name)

наконец отправьте запрос:)

0 голосов
/ 10 июня 2019

Вы можете сделать это следующим образом:

    var propertyImagePart: MultipartBody.Part? = null
            imageUrl.value?.let {
                val propertyImageFile = File(FILE_PATH)
                val propertyImage: RequestBody = RequestBody.create(MediaType.parse("image/*"), propertyImageFile)
                propertyImagePart =MultipartBody.Part.createFormData("userImage", propertyImageFile.name, propertyImage)
            }

    job = launch {
            try {
                val response = apiServiceWithoutHeader.doUpdateProfile(propertyImagePart,profileRequest.getMultipart()).await()
                stateLiveData.postValue(UserProfileState.SuccessUpdateProfile(response))
            } catch (e: JsonSyntaxException) {
                onException(e)
            } catch (e: JsonParseException) {
                onException(e)
            } catch (e: IOException) {
                onException(e)
            } catch (e: HttpException) {
                onException(e)
            }
        }
0 голосов
/ 10 июня 2019

Попробуйте изменить
@Part("ref_picture") file: RequestBody?
до
@Part("ref_picture") file: MultipartBody.Part?

И сделай это

// create RequestBody instance from file
RequestBody requestFile = RequestBody.create(MediaType.parse(getContentResolver().getType(fileUri)),file);

// MultipartBody.Part is used to send also the actual file name
MultipartBody.Part body = MultipartBody.Part.createFormData("picture", file.getName(), requestFile);

Вы также можете проверить этот ответ https://stackoverflow.com/a/34562971/8401371

...