Error loading file using Retrofit 2

I am trying to upload a file (image) to a server using Retrofit 2 . I follow this tutorial , which at first seems pretty simple, but didn't work in my case ...

When I call the API function, I always get this error:

 W/System.err: java.lang.ArrayIndexOutOfBoundsException: length=1; index=1 W/System.err: at retrofit2.ServiceMethod$Builder.build(ServiceMethod.java:190) W/System.err: at retrofit2.Retrofit.loadServiceMethod(Retrofit.java:166) W/System.err: at retrofit2.Retrofit$1.invoke(Retrofit.java:145) W/System.err: at java.lang.reflect.Proxy.invoke(Proxy.java:393) W/System.err: at com.plante.android.cobalt.fragment.FragmentIncidentPlan.uploadFile(FragmentIncidentPlan.java:575) 

Here is my API call:

 @Multipart @POST(Constants.URL_UPLOAD) Call<ResponseBody> upload(@Part RequestBody description, @Part MultipartBody.Part file); 

Here is the method I use to upload the file:

 private void uploadFile(String path) { // create upload service client // use the FileUtils to get the actual file by uri File file = new File(path); Log.e(TAG, file.getAbsolutePath()); // create RequestBody instance from file RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file); // MultipartBody.Part is used to send also the actual file name MultipartBody.Part body = MultipartBody.Part.createFormData("picture", file.getName(), requestFile); // add another part within the multipart request String descriptionString = "hello, this is description speaking"; RequestBody description = RequestBody.create( MediaType.parse("multipart/form-data"), descriptionString); // finally, execute the request Call<ResponseBody> call = cobaltServices.upload(description, body); call.enqueue(new Callback<ResponseBody>() { @Override public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { Log.v("Upload", "success"); } @Override public void onFailure(Call<ResponseBody> call, Throwable t) { Log.e("Upload error:", t.getMessage()); } }); } 
+8
android retrofit retrofit2
source share
2 answers

I am fixing my problem using this link: https://github.com/square/retrofit/issues/1063#issuecomment-145920568

This is the solution to the problem:

 @Multipart @POST ("/api/Events/editevent") Call<Event> editEvent (@PartMap Map<String, RequestBody> params); 

I call it as follows.

 Map<String, RequestBody> map = new HashMap<>(); map.put("Id", AZUtils.toRequestBody(eventId)); map.put("Name", AZUtils.toRequestBody(titleView.getValue())); if (imageUri != null) { File file = new File(imageUri.getPath()); RequestBody fileBody = RequestBody.create(MediaType.parse("image/png"), file); map.put("file\"; filename=\"pp.png\"", fileBody); } Call<Event> call = api.editEvent(map); call.enqueue(new Callback<Event>() { } 

The toRequestBody method simply converts String to RequestBody

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

Exceptions say that the first @Part does not need a name for annotation.

 @Multipart @POST(Constants.URL_UPLOAD) Call<ResponseBody> upload(@Part RequestBody description, @Part MultipartBody.Part file); 
+6
source share

All Articles