Загрузить список объектов и файлов с помощью модифицированного Android

#android #retrofit #multipartform-data

#Android #модифицированный #multipartform-данные

Вопрос:

  I have a list like
   [{
   Imgstr:"obj as string", 
   Ingfile:file
   },{
   Imgstr:"obj as string", 
   Ingfile:file
   }
    ]
 

Как я могу загрузить их как составные x, если это один объект, который я отправляю как составное тело и файл

Комментарии:

1. Это не сервис для написания кода. Я предлагаю вам начать с чтения документации по модернизации. Начните с чего-нибудь простого, например, со списка строк или списка объектов с одной строкой.

Ответ №1:

попробуйте перейти по этой ссылке, и я включу некоторые из них здесь:

Если это ваша первая загрузка файлов с помощью руководства по модернизации, вам следует посетить наши руководства по загрузке файлов с помощью модернизации и загрузке нескольких файлов.

В предыдущих уроках мы использовали различные параметры загрузки в классе FileUploadService:

 public interface FileUploadService {  
    // previous code for single file uploads
    @Multipart
    @POST("upload")
    Call<ResponseBody> uploadFile(
            @Part("description") RequestBody description,
            @Part MultipartBody.Part file);

    // previous code for multiple files
    @Multipart
    @POST("upload")
    Call<ResponseBody> uploadMultipleFiles(
            @Part("description") RequestBody description,
            @Part MultipartBody.Part file1,
            @Part MultipartBody.Part file2);
}
 

Второй вариант позволяет загружать несколько файлов, но вы всегда должны заранее указать, сколько. Это сложно, когда в вашем приложении нет фиксированного количества файлов, и оно может варьироваться в зависимости от варианта использования или пользовательского ввода.

Загрузка динамического количества файлов

Решением этой проблемы является передача списка или массива MultipartBody.Часть объектов. Затем Retrofit и OkHttp создадут соответствующий составной запрос со всеми файлами. Java-массивы или списки позволяют свободно добавлять файлы по мере необходимости.

Объявление конечной точки Вы знаете теорию, так что пришло время взглянуть на пример. Как всегда, мы начнем с описания интерфейса конечной точки. Конечно, это зависит от вашего серверной части. Убедитесь, что ваш API может обрабатывать случайное количество файлов!

 public interface FileUploadService {  
    @Multipart
    @POST("upload")
    Call<ResponseBody> uploadMultipleFilesDynamic(
            @Part("description") RequestBody description,
            @Part List<MultipartBody.Part> files);
}
 

В предыдущих примерах мы сопровождали описание каждым запросом. Мы сохраним его, чтобы показать вам, как это будет работать, но, конечно, это всего лишь одно описание для большого количества файлов. Если вам нужно также отправлять динамическое количество другой информации, вам следует ознакомиться с нашим руководством по @PartMap.

Вторая часть реализации заключается в использовании нового объявления конечной точки и передаче некоторых файлов. Мы повторно используем вспомогательные методы из наших предыдущих руководств, чтобы упростить создание необходимых составных частей:

 @NonNull
private RequestBody createPartFromString(String descriptionString) {  
    return RequestBody.create(
            okhttp3.MultipartBody.FORM, descriptionString);
}

@NonNull
private MultipartBody.Part prepareFilePart(String partName, Uri fileUri) {  
    // https://github.com/iPaulPro/aFileChooser/blob/master/aFileChooser/src/com/ipaulpro/afilechooser/utils/FileUtils.java
    // use the FileUtils to get the actual file by uri
    File file = FileUtils.getFile(this, fileUri);

    // 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
    return MultipartBody.Part.createFormData(partName, file.getName(), requestFile);
}   
 

Наконец, мы соберем все вместе, чтобы создать запрос на загрузку:

 Uri photoUri = ... // get it from a file chooser or a camera intent  
Uri videoUri = ... // get it from a file chooser or a camera intent  
// ... possibly many more file uris

// create list of file parts (photo, video, ...)
List<MultipartBody.Part> parts = new ArrayList<>();

// add dynamic amount
if (photoUri != null) {  
    parts.add(prepareFilePart("photo", photoUri));
}

if (videoUri != null) {  
    parts.add(prepareFilePart("video", videoUri));
}

// ... possibly add more parts here

// add the description part within the multipart request
RequestBody description = createPartFromString("hello, this is description speaking");

// create upload service client
FileUploadService service = ServiceGenerator.createService(FileUploadService.class);

// finally, execute the request
Call<ResponseBody> call = service.uploadMultipleFilesDynamic(description, parts);  
call.enqueue(...);  
 

Все описанные выше шаги должны быть вам хорошо знакомы. Мы просто создаем часть для каждого файла и описания. После того, как все будет собрано, мы можем создать новый объект вызова из нашего FileUploadService и выполнить запрос как обычно.