使用Retrofit 1.9上传图像无法正常工作

时间:2016-03-07 21:54:02

标签: android image upload retrofit multipart

我使用外部API上传个人资料照片。 http://open.convio.com/api/#teamraiser_api.uploadPersonalPhoto_method.html

这是我的代码:

@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。

2 个答案:

答案 0 :(得分: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,因此请求可能会在服务器端失败。

答案 1 :(得分:0)

我使用了API中的remove方法,它正在运行。 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,作为编码String传递,并且没有任何效果。随着@Query的更新标题发送,但照片不是。