2015-11-03 2 views
1

Я использую Retrofit beta2, и я борюсь за многостраничную загрузку. Я пробовал код, как указано here. Возможно, я что-то пропустил.Retrofit 2 beta2 не удалось выполнить многостраничную загрузку

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 "[email protected]/path/to/my/image.jpg" \ 
> http://domain.com/api/v1/messages?recipient_user_id=USER_ID&message=test 

ответ

0

Маленькое предисловие: Я являюсь соавтором связанного сообщения в блоге.

Ваш код выглядит в основном хорошим. Небольшая разница между нашим тестируемым кодом и вашим - это объявление @Part() RequestBody file. Наш код не содержит никаких указаний к файлу:

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

В своем коде, с другой стороны, является:

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

Я предлагаю удалить часть объявления name=\" из объявления и повторить попытку. Если это не поможет, какова ваша ошибка?

+0

вы правы @peitek, вы просто должны удалить 'имя = \" 'часть – chip

1

Может быть, вы можете удалить @Multipart

Так же, как это,

@POST("/V2/image/{type}") 
Call<ImageUrl> uploadImg(@Path("type") int type, @Body RequestBody image); 

Для создания RequestBody, вы можете использовать

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

Когда я запрашиваю с @Multipart, файл изображения будет помещен в тело запроса. Когда без @Multipart, файл находится в заголовке запроса.

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

Смежные вопросы