Как отправить массив изображений вместе с данными на изображение, используя Retrofit 2? - PullRequest
0 голосов
/ 27 сентября 2018

Допустим, у меня есть эта модель :

data class PhotoRequest(
  @SerializedName("page_number")
  val pageNumber: Int,
  @SerializedName("image")
  val requestBody: MultipartBody.Part
)

multipart создается с использованием этого:

val photo = File(picturePath)
val requestFile = RequestBody.create(
        MediaType.parse("image/jpeg"),
        photo
    )
return MultipartBody.Part.createFormData("images", photo.name, requestFile)

Модификация строитель:

 val builder = Retrofit.Builder()
            .baseUrl(BuildConfig.BASE_URL)
            .addConverterFactory(ScalarsConverterFactory.create())
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .addConverterFactory(GsonConverterFactory.create(gsonBuilder.create()))

А это интерфейс Модификация :

@Multipart
    @POST("my_endpoint")
    fun sendExample(
        @Part("name") name: String,
        @Part("email") email: String,
        @Part("images[]") images: List<PhotoRequest>
    ): Single<String>

То, что я пытаюсь сделать, это отправить кратныеизображения вместе с параметром на изображение, в данном случае это номер страницы.

Сервер (rails) не распознает изображение ни в одном запросе, фактически содержимое внутри ключа «images»полученный в виде массива строк .

 "images"=>["{\"page_number\":1,\"image\":{\"headers\":{\"namesAndValues\":[\"Content-Disposition\",\"form-data; name=\\\"image\\\"; filename=\\\"1537970501549.jpg\\\"\"]]}}}"]

Кто-нибудь знает, как правильно отправить этот запрос?или как вручную обработать изображения со стороны рельсов?

1 Ответ

0 голосов
/ 16 ноября 2018

Так вы объявляете в своем интерфейсе API.Вам не нужно имя детали для списка изображений.

@Multipart
@POST("my_endpoint")
fun sendExample(
    @Part("name") name: String,
    @Part("email") email: String,
    @Part images: List<MultipartBody.Part>
): Single<String>

, тогда куда бы вы ни пытались отправить запрос, добавьте этот метод и создайте список multipartBody.part

 fun prepareFilePart(partName: String, file: File): MultipartBody.Part {
    val requestFile = RequestBody.create(MediaType.parse("image/png"), file)
    return MultipartBody.Part.createFormData(partName, file.name, requestFile)
}

 val listOfImages = ArrayList<MultipartBody.Part>()
 for (i in 0 until images.size) {
     listOfImages.add(prepareFilePart("image[$i]", images[i]))
 }

, затем выможно отправить запрос так:

sendExample("some name", "email@ru.org", listOfImages)
...