2016-03-07 1 views
0

J'utilise une API externe pour télécharger une photo de profil. http://open.convio.com/api/#teamraiser_api.uploadPersonalPhoto_method.htmlTéléchargement de l'image avec Retrofit 1.9 ne fonctionne pas

Voici mon code:

@Multipart 
@POST("/CRTeamraiserAPI?method=uploadPersonalPhoto") 
public void uploadPersonalPhotoAsync(
     @Query("fr_id") int frId, 
     @Part("graphic_upload_file") TypedFile graphic_upload_file, 
     @Query("graphic_upload_upload") boolean graphic_upload_upload, 
     @Query("graphic_caption") String graphic_caption, 
     @Header("sso_auth_token") String token, 
     Callback<UploadPersonalPhotoResponse> callback); 

Et voilà comment je l'utilise

public void uploadPersonalPhotoAsync(final String cacheKey, int frID, String token, String graphic_upload_file, boolean graphic_upload_upload) { 

    File imgFile = new File(graphic_upload_file); 
    TypedFile tFile = new TypedFile("image/*", imgFile); 

    mTeamRaiserApi.uploadPersonalPhotoAsync(frID, tFile, true, "caption", token, new Callback<UploadPersonalPhotoResponse>() { 
     @Override 
     public void success(UploadPersonalPhotoResponse uploadPersonalPhotoResponse, Response response) { 
      uploadPersonalPhotoResponse.lastUpdatedTime = System.currentTimeMillis(); 
      uploadPersonalPhotoResponse.loadedFromCache = false; 
      uploadPersonalPhotoResponse.cacheKey = cacheKey; 
      EventBus.getDefault().post(new UploadPersonalPhotoEvent(uploadPersonalPhotoResponse)); 
     } 

     @Override 
     public void failure(RetrofitError error) { 
      EventBus.getDefault().post(new UploadPersonalPhotoEvent(null)); 
     } 
    }); 
} 

Seule la légende est mis à jour. Le journal affiche Content-Type: multipart/form-data comme requis par l'API.

Répondre

0

Etes-vous sûr que votre serveur accepte l'image/*. Essayez d'utiliser image/png ou image/jpeg.

Si cela ne fonctionne pas utiliser ceci:

TypedFile typedFile = new TypedFile("multipart/form-data", new File("path/to/your/file")); 

Assurez-vous que vous ne spécifiez pas l'en-tête,

request.addHeader("Content-Type", "application/json"); 

via RequestInterceptor. La requête échouera probablement au niveau du serveur puisque vous envoyez des données en plusieurs parties et non JSON.

+0

J'ai fait les changements suggérés mais ne fonctionne toujours pas. – Marcelojaf

0

J'ai utilisé la méthode remove de l'API et cela fonctionne. http://open.convio.com/api/#teamraiser_api.removePersonalPhoto_method.html

Je mis en œuvre comme ceci:

@Multipart 
@POST("/CRTeamraiserAPI?method=removePersonalPhoto") 
public void removePersonalPhotoAsync(
     @Query("fr_id") int frId, 
     @Part("BLABLABLA")String test, 
     @Query("graphic_upload_delete") boolean deletePhoto1, 
     @Header("sso_auth_token") String token, 
     Callback<RemovePersonalPhotoResponse> callback); 

D'abord, je tentais sans utiliser @Multipart et ne fonctionnait pas. Donc, j'ai inclus le @Multipart et un paramètre @Part aléatoire et bingo! Ensuite, j'ai essayé d'apporter quelques modifications à la méthode de téléchargement, en passant de Query à Part, en passant l'image en tant que TypedFile, en tant que RequestBody, en tant que String encodé, et rien ne fonctionne. La légende envoyée comme @Query est mise à jour, mais pas la photo.