Retrofit2-无法使用PartMap上传文件

时间:2019-07-02 04:28:00

标签: java android retrofit2 image-uploading

我有此文件,界面和过程。 我试图将图像上传到服务器,但我只发送表单数据。图片已消失,未上传。我做错了什么?

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

void需要使用第三方datetime 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 :(得分:0)

使用此代码获取图像路径

 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

答案 1 :(得分:0)

我认为您无法成功从存储中获取图像文件。因此,请检查我的以下代码链接

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