2015-11-02 4 views
3

Я использую Retrofit в своем приложении Android для связи с REST-API. Когда пользователь меняет изображение своего профиля в моем приложении, мне нужно отправить запрос и загрузить новое изображение. Это моя служба:Как загрузить фотографию с помощью «Дооснащения»?

@Multipart 
@PATCH("/api/users/{username}/") 
Call<User> changeUserPhoto(@Header("Authorization") String token,@Path("username") String userName , @Part("photo") RequestBody photo); 

И это мой код, чтобы отправить запрос:

Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl(GlobalVars.BASE_URL) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .build(); 
     UserService userService = retrofit.create(UserService.class); 
     Callback<User> callback = new Callback<User>() { 
      @Override 
      public void onResponse(Response<User> response, Retrofit retrofit) { 

       if (response.isSuccess()) { 
        //do sth 
       } else { 
        // do sth else 
       } 
      } 


      @Override 
      public void onFailure(Throwable t) { 
       t.printStackTrace(); 
      } 
     }; 
     RequestBody photo = RequestBody.create(MediaType.parse("application/image"), new File(imageUir)); 
     Call<User> call = userService.changeUserPhoto(token, username, photo); 

     call.enqueue(callback); 

Но когда я отправить этот запрос на сервер, REST продолжает говорить мне, что фото не является файлом и что-то неправильно с типом кодирования. Может ли кто-нибудь помочь мне, как это исправить?

ответ

6

Попробуйте использовать @Body вместо @Part.

@PATCH("/api/users/{username}/") 
Call<User> changeUserPhoto(@Header("Authorization") String token,@Path("username") String userName , @Body RequestBody photo); 

затем использовать MultipartBuilder построить RequestBody

RequestBody photo = RequestBody.create(MediaType.parse("application/image"), file); 
RequestBody body = new MultipartBuilder() 
     .type(MultipartBuilder.FORM) 
     .addFormDataPart("photo", file.getName(), photo) 
     .build(); 

Call<User> call = userService.changeUserPhoto(token, username, body); 
... 

EDIT:

Вы также можете проверить мой answer на очень похожий вопрос.

+0

Спасибо. Ваш ответ сработал :) –

-1

Преобразуйте свою фотографию в base64 и загрузите ее как простое тело струны.

+3

Если изображение большое, это не удастся –

0

Лучшим вариантом будет преобразование битмапа в строку и загрузка в виде строки.

Смежные вопросы