Android: загрузка файла изображения и данных формы через почтовый запрос всегда не выполняется

Я использую BasicImageDownloader для загрузки изображения с facebook-graph (я могу подтвердить факт, что URL-адрес работает и файл загружен), а затем с помощью Retrofit сделал HTTP-запрос на публикацию, в котором я прикрепляю файл изображения и некоторые данные формы. Он всегда терпит неудачу и не попадает в мой API в бэкэнде с запросом. Вот мой фрагмент кода. Любое предложение будет оценено по достоинству. (Я изменил значение baseURL на «www.example.com», но при необходимости могу предоставить его.)

зависимость:

implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
implementation 'com.squareup.okhttp3:okhttp:3.12.0'
implementation 'com.google.code.gson:gson:2.8.5'

Класс интерфейса API

package com.redhen.cuttiin.customerInterface;

import com.teckdk.cuttiin.model.LoggedIn;
import java.util.Map;
import okhttp3.MultipartBody;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.Header;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.Part;
import retrofit2.http.PartMap;
import retrofit2.http.Url;

public interface CustomerApi {
   @Multipart
   @POST("/api/customer/signup")
   Call<ResponseBody> createUser(@Part MultipartBody.Part part,@PartMap 
   Map<String, RequestBody> params);
}

Где я использую метод HTTP-запроса на публикацию

    private void createCustomer(final String email, final String firstName, final String lastName, final String url) {
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("https://teckdkdev.online/")
            .addConverterFactory(GsonConverterFactory.create())
            .build();

    CustomerApi customerApi = retrofit.create(CustomerApi.class);



    Calendar calendar = Calendar.getInstance();
    SimpleDateFormat mdformat = new SimpleDateFormat("YYYY-MM-DD HH:mm:ss", Locale.US);
    final String strDate = mdformat.format(calendar.getTime());
    final String imageName = UUID.randomUUID().toString();


    BasicImageDownloader basicImageDownloader = new BasicImageDownloader(new BasicImageDownloader.OnImageLoaderListener() {
        @Override
        public void onError(BasicImageDownloader.ImageError error) {
            Log.i("ERROR", "Error code " + error.getErrorCode());

        }

        @Override
        public void onProgressChange(int percent) {

        }

        @Override
        public void onComplete(Bitmap result) {
            final Bitmap.CompressFormat mFormat = Bitmap.CompressFormat.JPEG;
            final File myImageFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() +
                    File.separator + "image_test" + File.separator + imageName + "." + mFormat.name().toLowerCase());

            HashMap<String, RequestBody> params = new HashMap<>();
            params.put("firstName", toRequestBody(firstName));
            params.put("lastName", toRequestBody(lastName));
            params.put("email", toRequestBody(email));
            params.put("profileImageName", toRequestBody(imageName));
            params.put("password", toRequestBody("not available"));
            params.put("dateCreated", toRequestBody(strDate));
            params.put("dateCreatedTimezone", toRequestBody(userTimezone));
            params.put("dateCreatedCalendar", toRequestBody(userCalendar));
            params.put("dateCreatedLocale", toRequestBody(userLocale));
            params.put("authenticationType", toRequestBody("facebook"));
            params.put("role", toRequestBody("customer"));
            params.put("barberShopOwner", toRequestBody("NO"));
            params.put("accountDeactivated", toRequestBody("NO"));

            RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"), myImageFile);
            MultipartBody.Part part = MultipartBody.Part.createFormData("file", myImageFile.getName(), requestBody);

            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl("https://example.com/")
                    .build();

            CustomerApi customerApi = retrofit.create(CustomerApi.class);
            customerApi.createUser(part, params).enqueue(new Callback<ResponseBody>() {
                @Override
                public void onResponse(Call<ResponseBody> call, retrofit2.Response<ResponseBody> response) {
                    try {

                        Log.d("response data", "message" + response.body().string());
                        System.out.println(response);
                    }catch (Exception e) {
                        e.printStackTrace();
                        System.out.println(response);
                    }

                }

                @Override
                public void onFailure(Call<ResponseBody> call, Throwable t) {
                    Log.i("error occured", "something died");
                    System.out.println(call.request().toString());

                }
            });
        }
    });

    basicImageDownloader.download(url, true);
}

public RequestBody toRequestBody(String value) {
    RequestBody body = RequestBody.create(MediaType.parse("text/plain"), value);
    return body;
}

Я пришел к такому подходу, используя этот Вопрос задан и этот Вопрос задан

Не могли бы вы добавить код ошибки и трассировку стека?

Seungmin Ha 18.12.2018 01:02

Это не код ошибки, поскольку он загружается полностью и выводит это сообщение в Logcat «2018-12-18 01: 20: 40.003 575-575 / com.teckdk.cuttiin D / BasicImageDownloader: загрузка завершена, передано 409600 байт» и ошибки трассировки стека. Я мог распечатать их из Throwable t. в методе onFailure (), который был массивом, я пропустил его, чтобы распечатать.

Hans Ben 18.12.2018 01:42

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

Seungmin Ha 18.12.2018 02:59

Вы должны нет сохранить загруженное растровое изображение result в файл. Переменная result, которая является битовой картой, даже не использовалась в onComplete().

Meow Cat 2012 18.12.2018 03:01

Сработало вроде забыл сохранить файл @ MeowCat2012

Hans Ben 18.12.2018 11:51

Ха-ха, будь осторожен в следующий раз ~

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

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