【问题标题】:Retrofit2 - Cannot upload file with PartMapRetrofit2 - 无法使用 PartMap 上传文件
【发布时间】:2019-11-12 16:20:01
【问题描述】:

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

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

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

【问题讨论】:

    标签: java android retrofit2 image-uploading


    【解决方案1】:

    使用此代码获取图片路径

     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
    

    【讨论】:

    • 我从许多示例代码中做到了这一点。我得到了请求超时
    • 使用调试 :) 因为我在这里没有发现任何问题
    • 我什至不知道如何在 android studio 上使用 debug.. 我只知道 netbeans,因为它不同..
    【解决方案2】:

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

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

    【讨论】:

    • 你可能是对的,我将图像文件保存在具有只读权限的/data目录中。
    猜你喜欢
    • 1970-01-01
    • 2018-11-07
    • 1970-01-01
    • 2020-12-05
    • 2016-10-22
    • 1970-01-01
    • 2018-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多