【问题标题】:Uploading image using Retrofit 1.9 not working使用 Retrofit 1.9 上传图像不起作用
【发布时间】:2016-06-21 15:46:35
【问题描述】:

我正在使用外部 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。

【问题讨论】:

    标签: android image upload retrofit multipart


    【解决方案1】:

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

    如果它不起作用,请使用:

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

    确保您没有指定标题,

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

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

    【讨论】:

      【解决方案2】:

      我使用了 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,作为编码字符串传递,但没有任何效果。 @Query 时发送的标题已更新,但照片未更新。

      【讨论】:

        猜你喜欢
        • 2022-08-13
        • 2018-04-11
        • 1970-01-01
        • 2018-07-04
        • 2017-03-28
        • 2016-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多