Retrofit2 - невозможно загрузить файл с помощью PartMap - PullRequest
0 голосов
/ 02 июля 2019

У меня есть эти файлы, интерфейс и процесс. Я пытаюсь загрузить изображение на сервер, но отправляю только данные формы. Изображение пропало, не загружено. Что я сделал не так?

public interface ClientRoute {    
 @Multipart
 @POST("attendance/in")
 Call < DataAttendance > inAttendance(
  @PartMap Map < String, RequestBody > partMap,
  @HeaderMap Map < String, String > headers);
}

Это void требует даты времени от стороннего API даты и времени, и в случае успеха программа выполняет процесс загрузки. Этот код работает, но только данные формы, такие как текст.

public void inAttendance(int userId, String token, int storeId, String timeAttendance, String photoPath, int refId,
 double latitude, double longitude) {

 timeController.getTimeaAsync("yyyy-MM-dd HH:mm:ss", false, new TimeInterface() {
  @Override
  public void onSuccess(@NonNull String value) {

   Map < String, RequestBody > params = new HashMap < > ();
   params.put("storeId", requestBody(String.valueOf(storeId)));
   params.put("time_attendance", requestBody(value));
   params.put("refId", requestBody(String.valueOf(refId)));
   params.put("photo", RequestBody.create(MediaType.parse("image/*"), photoPath));
   params.put("latitude", requestBody(String.valueOf(latitude)));
   params.put("longitude", requestBody(String.valueOf(longitude)));

   Map < String, String > headers = new HashMap < > ();
   headers.put("userId", String.valueOf(userId));
   headers.put("token", token);


   clientRoute = ClientUtils.getClientRoute();
   clientRoute.inAttendance(params, headers).enqueue(new Callback < DataAttendance > () {
    @Override
    public void onResponse(Call < DataAttendance > call, Response < DataAttendance > response) {
     Log.i(TAG, "Response code: " + response.raw().code() + "\r\n" +
      "Request url: " + response.raw().request().url() + "\r\n");
     if (!response.isSuccessful() || response.body() == null) {
      try {
       Log.e(TAG, response.errorBody().string());
      } catch (IOException e) {
       e.printStackTrace();
      }
      return;
     }

     DataAttendance dataAttendance = response.body();

     if (dataAttendance.getStatusCode() == 0) {
      return;
     }

     Toast.makeText(context, "Attendance ID: " + dataAttendance.getStatusCode(), Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onFailure(Call < DataAttendance > call, Throwable t) {
     Log.e(TAG, "onFailure: " + t);
    }
   });
  }

  @Override
  public void onError(@NonNull Throwable throwable) {

  }
 }, false);
}

private RequestBody requestBody(String value) {
 return RequestBody.create(MediaType.parse("text/plain"), value);
}

Я пытался найти недостающие параметры или опечатки, но не нашел их. Все параметры, необходимые для сервера, являются правильными. Но файл изображения не будет загружен. Кто-нибудь готов мне помочь? Я очень ценю это.

Ответы [ 2 ]

0 голосов
/ 02 июля 2019

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

https://stackoverflow.com/a/56846740/5435259

0 голосов
/ 02 июля 2019

используйте этот код для получения пути к изображению

 File file = new File(String.valueOf(uriFilePath.getPath()));
        RequestBody requestFile =
                RequestBody.create(MediaType.parse("image/*"), file);

        MultipartBody.Part body =
                MultipartBody.Part.createFormData("image", file.getName(), requestFile);

в интерфейсе API

@Part MultipartBody.Part image
...