Как отправить список файлов как часть тела Retrofit 2 вместе с другими обычными строковыми полями в Android? - PullRequest
0 голосов
/ 03 марта 2020

как говорится в вопросе, мне нужно отправить список файлов (в моем случае изображения) в запросе HTTP POST, но рядом с ним есть другие поля (обычные строки). Сообщение выглядит примерно так (как данные формы):

type: customerQuery
user: userId
message: The customer query etc.
contact_number: 01234564789
contact_email: email@address.com
files[]: list of files, as binary

Загрузка файлов работает нормально, когда я только отправляю файлы, как показано ниже:

  @Multipart
  @POST("/exampleendpoint/{id}")
  suspend fun uploadDocument(
      @Path("id") id: String,
      @Part document: MultipartBody.Part
  ): Response<Unit>

Как мне создать модифицированный интерфейс / сервис, чтобы иметь список файлов, а также другие поля?

Спасибо

Ответы [ 2 ]

1 голос
/ 03 марта 2020

сделать это

@Multipart
@POST("exampleendpoint/{id}")
Call<Unit> uploadDocument(@Path("id") String id,
                          @Part("type") RequestBody type,
                          @Part("user") RequestBody user,
                          @Part("message") RequestBody message,
                          @Part("contact_number") RequestBody contact_number,
                          @Part("contact_email") RequestBody contact_email,
                          @Part List<MultipartBody.Part> file);

и добавить список файлов, подобных этому

ArrayList<File> tempFilesList = new ArrayList<>();
ArrayList<MultipartBody.Part> images = new ArrayList<>();
for (int i = 0; i < tempFilesList.size(); i++) {
    images.add(prepareImageFilePart("files" + (i + 1), tempFilesList.get(i).getImage()));
}

@NonNull
private MultipartBody.Part prepareImageFilePart(String partName, File file) {
    RequestBody requestFile =
            RequestBody.create(
                    MediaType.parse("image/jpg"),
                    file
            );
    return MultipartBody.Part.createFormData(partName, file.getName(), requestFile);
}

, вы можете создать RequestBody других полей, подобных этому

RequestBody type = RequestBody.create(MediaType.parse("text/plain"), "your data...");
0 голосов
/ 03 марта 2020

Хорошо, думал, что я добавлю свой собственный ответ для всех, кто использует Kotlin, также это правильный ответ, если вам нужно иметь список имен файлов / изображений, как и остальные данные формы . Принятый ответ сработает, если вам это не нужно, но в моем случае он не сработал, так как он должен был быть под files[].

Службой модернизации (просто простое поле @Body body: RequestBody, и удалить @Multipart)

@POST("exampleendpoint/{id}")
fun uploadDocuments(@Path("id") id: String, @Body body: RequestBody): Response<Unit>;

Затем вам нужно построить полную RequestBody, включая все, что вам нужно, например, как показано ниже:

val requestBody = MultipartBody.Builder().setType(MultipartBody.FORM).apply {
  addFormDataPart("type", "booking")
  addFormDataPart("user", "username")
  addFormDataPart("message", "message text goes here")
  addFormDataPart("contact_number", "0123456789")
  addFormDataPart("contact_email", "email@address.com")
  // my files are List<ByteArray>, okhttp has a few utility methods like .toRequestBody for various types like below
  files.forEachIndexed { index, bytes ->
     addFormDataPart("files[]", "$index.jpg", bytes.toRequestBody("multipart/form-data".toMediaTypeOrNull(), 0, bytes.size))
  }
}.build()
service.uploadDocuments("uploadId", requestBody)
...