2016-03-07 21 views
0

我正在使用外部API上传个人资料照片。 http://open.convio.com/api/#teamraiser_api.uploadPersonalPhoto_method.html使用Retrofit上传图片1.9不工作

这里是我的代码:

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

这是我使用它如何

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

只有标题被更新。该日志显示API所要求的Content-Type:multipart/form-data。

回答

0

您确定您的服务器接受图像/ *。尝试使用image/png或image/jpeg。

如果它不能正常工作使用此:

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

确保你没有指定标题,

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

。由于您要发送多部分数据而不是JSON,因此请求可能会在服务器端失败。

+0

我提出了建议的更改,但仍然无法正常工作。 – Marcelojaf

0

我使用API​​的删除方法,它的工作。 http://open.convio.com/api/#teamraiser_api.removePersonalPhoto_method.html

我实现这样的:

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

首先,我试图不使用@Multipart并不能正常工作。所以,我包含了@Multipart和一个随机@Part参数和宾果!然后我尝试对上传方法进行一些更改,从Query更改为Part,将TypedFile作为RequestBody作为编码字符串传递,并且没有任何效果。作为@Query发送的字幕被更新,但照片不是。