Отправить изображения как составные с другими параметрами в запросе залпа

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

List<String> imagePathList = imageFilePaths;
List<MultipartBody.Part> partMap = new ArrayList<>();
for (int i = 0; i < imagePathList.size(); i++) {
    Uri fileUri = Uri.parse(imagePathList.get(i));
    RequestBody requestFile = RequestBody.create(
            MediaType.parse(getMimeTypee(FileUtils.getFile(getContext(), fileUri).getAbsolutePath())),
            FileUtils.getFile(getContext(), fileUri)
    );

   MultipartBody.Part body = MultipartBody.Part.createFormData("court_image[" + i + "]", FileUtils.getFile(getContext(), fileUri).getName(), requestFile);
   partMap.add(body);
}

Где imageFilePaths - это ArrayList. Сервер будет получать изображения, такие как court_image[0], court_image[1] и т. д., В зависимости от того, сколько путей к изображениям у меня есть в ArrayList.

Запрос на залп здесь:

RequestQueue queue = Volley.newRequestQueue(getContext());
StringRequest postRequest = new StringRequest(Request.Method.POST, url1,
        new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                Toast.makeText(mBaseAppCompatActivity, "Success", Toast.LENGTH_SHORT).show();
           }
        },
        new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {

            }
        }
) {

    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        Map<String, String> params = new HashMap<String, String>();
        String token = getToken();
        params.put("Authorization", "Bearer " + token);
        params.put("Content-Type", "multipart/form-data");
        return params;
    }

    @Override
    protected Map<String, String> getParams() {
        Map<String, String> params = new HashMap<String, String>();
        params.put("terms", "true");
        params.put("phone", "phoneNo");
        return params;
    }

};
queue.add(postRequest);

Теперь дело в том, что я новичок в многочастной вещи, с ее помощью я могу получить изображение из галереи и сохранить их путь в ArrayList, но я не знаю, как передать многосоставные данные в этом залпе. запрос. Пожалуйста помоги.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
745
1

Ответы 1

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

Для загрузки изображения вместе с некоторыми другими параметрами я использовал залп. Однако я нашел оболочку исходной библиотеки volley, которую легче интегрировать для многостраничных запросов. Поэтому я добавил в файл build.gradle следующую библиотеку.

dependencies {
    compile 'dev.dworks.libs:volleyplus:+'
}

Я удалил оригинальную библиотеку волейбола со своего build.gradle и вместо этого использовал указанную выше библиотеку, которая может обрабатывать как составные, так и обычные запросы с аналогичной техникой интеграции.

Затем мне просто нужно было написать следующий класс, который обрабатывает операцию запроса POST.

public class POSTMediasTask {
    public void uploadMedia(final Context context, String filePath) {

        String url = getUrlForPOSTMedia(); // This is a dummy function which returns the POST url for you
        SimpleMultiPartRequest multiPartRequestWithParams = new SimpleMultiPartRequest(Request.Method.POST, url,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        Log.d("Response", response);
                        // TODO: Do something on success
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                // TODO: Handle your error here
            }
        });

        // Add the file here
        multiPartRequestWithParams.addFile("file", filePath);

        // Add the params here
        multiPartRequestWithParams.addStringParam("terms", "SomeTerms");
        multiPartRequestWithParams.addStringParam("phone", "85050055055");

        RequestQueue queue = Volley.newRequestQueue(context);
        queue.add(multiPartRequestWithParams);
    }
}

Теперь выполните следующую задачу.

new POSTMediasTask().uploadMedia(context, mediaPath);

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

Надеюсь, это поможет!

Это должно быть довольно просто без использования библиотеки. Быть настолько зависимым от библиотек, которые могут не часто обновляться ... я думаю, что это не очень хорошая идея.

Amir Dora. 25.10.2020 12:18

Другие вопросы по теме