Retrofit 2 beta2无法进行分段上传

时间:2015-11-03 09:16:03

标签: android retrofit

我正在使用Retrofit beta2而且我正在努力进行分段上传。我已经尝试了指定here的代码。我可能在这里错过了一些东西。

public interface SendMediaApiService {
    @Multipart
    @POST(/api/v1/messages)
    Call<ApiResponse> upload(
            @Header("Authorization") String token,
            @Query("recipient_user_id") String userId,
            @Query("message") String message,
            @Part("name=\"photo\"; filename=\"selfie.jpg\" ") RequestBody file
    );
}

private void upload() {
    Retrofit retrofit = new Retrofit.Builder()
        // do some stuffs here


    File file = new File(filePath);
    RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"), file);
    Call<ApiResponse> call = service.upload(token, userId, msg, requestBody);

}

当我卷曲

$ curl -v \
> -H "Authorization: Bearer TOKEN" \
> -F "photo=@/path/to/my/image.jpg" \
> http://domain.com/api/v1/messages?recipient_user_id=USER_ID&message=test

3 个答案:

答案 0 :(得分:1)

也许,您可以删除 @Multipart

就像这样,

    public static RequestBody createImageRequest(Bitmap bitmap) {
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream);
    return new MultipartBuilder()
            .type(MultipartBuilder.FORM)
            .addFormDataPart("file", "test.png", RequestBody.create(MediaType.parse("image/png"), byteArrayOutputStream.toByteArray())).build();
}

要创建RequestBody,您可以使用

var localData = [

    { location:'x', id:1, name:'A' },
    { location:'x', id:2, name:'B' }, 
    { location:'y', id:3, name:'C' }, 
    { location:'y', id:4, name:'D' },
    { location:'y', id:5, name:'E' },
    { location:'z', id:6, name:'F' },
  ],
  i, j;

  for(i = 0; i < localData.length; i++){
      var l1 = localData[i].location;

      localData[i].rowspan = 1;

      for(j = i+1; j < localData.length; j++){
        var l2 = localData[j].location;
        if(l1 == l2){
          localData[i].rowspan += 1;
        }
        else{
          break;
        }
      }
      i = j-1;
  }
$scope.data = localData;

当我使用@Multipart请求时,图像文件将被放入请求正文中。没有@Multipart时,请求标题中的文件。

答案 1 :(得分:0)

小前言:我是链接博客文章的合着者。

您的代码看起来非常好。我们测试的代码与您的代码之间的一点区别是@Part() RequestBody file声明。我们的代码没有指定文件:

@Part("myfile\"; filename=\"image.png\" ") RequestBody file

另一方面,在你的代码中是:

@Part("name=\"photo\"; filename=\"selfie.jpg\" ") RequestBody file

我建议从声明中删除name=\"部分,然后重试。如果它没有帮助,你的错误是什么?

答案 2 :(得分:0)

我已成功使用Retroft上传了该图像文件。正如@peitek建议删除name=\"部分解决了这个问题。

对于那些遇到这种困难的人来说,下面这段代码是有效的(至少对我而言)。这可以作为您的参考。

interface SendMediaApiService {
    @Multipart
    @POST(/api/v1/messages)
    Call<ApiResponse> upload(
            @Header("Authorization") String token,
            @Query("recipient_user_id") String userId,
            @Query("message") String message,
            @PartMap Map<String, RequestBody> map
    );
}

private void upload() {
    Retrofit retrofit = new Retrofit.Builder()
    // do some stuffs

    Map<String, RequestBody> map = new HashMap<>();
    File file = new File(path);
    RequestBody requestBody = RequestBody.create(MediaType.parse("image/jpeg"), file);
    map.put("photo\"; filename=\"" + file.getName() + "\"", requestBody);

    SendMediaApiService service = retrofit.create(SendMediaApiService.class);
    Call<ApiResponse> call = service.upload(token, userId, msg, map);
    call.enqueue(this);
}

source