java - Retrofit2 - 无法使用 PartMap 上传文件

标签 java android retrofit2 image-uploading

我有这个文件、接口(interface)和流程。 我试图将图像上传到服务器,但我只发送表单数据。图片没了,没有上传。我做错了什么?

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);
}

我尝试查找丢失的参数或拼写错误,但没有找到。服务器所需的所有参数都是正确的。但图像文件不会上传。有人愿意帮助我吗?我真的非常感激。

最佳答案

使用此代码获取图像路径

 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接口(interface)

@Part MultipartBody.Part image

关于java - Retrofit2 - 无法使用 PartMap 上传文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56845332/

相关文章:

java - Tomcat 服务器上具有有效证书的 SSLHandshakeException

java换行

android - scaloid 示例布局不起作用

android - 在 Android Studio 中找不到局部变量调用

java - 在 Java 中使用 API 进行翻新

android - 改造 body 返回空

java - 在不阻塞主线程的情况下启动 JMSListener

java - 如何有一个计数器用于从 MYSQL 检索(Java)

c# - Xamarin : comparison to native SDK and JS-based frameworks

android - Firebase addListenerForSingleValueEvent 下载使用