Multipart Retrofit 2.0图片上传

时间:2016-01-19 23:01:48

标签: android api retrofit retrofit2

我正在尝试通过POST多部分请求上传图像,这应该具有如下结构:

----------------------------- 219391268715340 内容处理:表格数据;命名="照片[]&#34 ;;文件名=" DSCF0157-Laptop.JPG" 内容类型:image / jpeg

(字节数据)

我的代码:

        MediaType mediaType = MediaType.parse("image/jpeg");
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
        byte[] byteArray = stream.toByteArray();

        RequestBody file=RequestBody.create(mediaType, byteArray);
        map.put("form-data; name=\"photos[]\"; filename=\""+filename+".jpg",file);

我使用地图是因为@PartMap注释 - 我想上传多个文件。我的服务器返回http代码200 - 但没有上传文件。 Api调用已经过测试 - 如果我们的Web应用程序使用它,它可以正常工作。知道我做错了什么

2 个答案:

答案 0 :(得分:2)

如果您想使用Retrofit 2在请求中上传许多文件,可以在下面的问题中参考我的回答

  

Retrofit - Multipart request: Required MultipartFile parameter 'file' is not present

经过一些修改:

<强> WebAPIService.java:

@Multipart
@POST("/api/fileupload")
Call<ResponseBody> postFiles(@Part List<MultipartBody.Part> fileList);

<强> FileActivity.java:

...
List<MultipartBody.Part> fileList = new ArrayList<>();
for (int i = 0; i < 2; i++){
    fileList.add(body);

}
Call<ResponseBody> call = service.postFiles(fileList);
call.enqueue(new Callback<ResponseBody>() {
    @Override
    public void onResponse(Call<ResponseBody> call,
                           Response<ResponseBody> response) {
        Log.i(LOG_TAG, "success");
    }

    @Override
    public void onFailure(Call<ResponseBody> call, Throwable t) {
        Log.e(LOG_TAG, t.getMessage());
    }
});

当然,使用上面的代码,实际上,同一个文件(正文)将作为2个部分上传到请求中。因此,在Web服务器中,您将拥有2个具有相同内容的文件,您可以使用许多不同的文件自定义fileList:)

希望它有所帮助!

答案 1 :(得分:0)

也许你可以这样做。

<强> YourAPIService

@Multipart
@POST("api/image/upload")
Call<ImageUploadResponse> uploadImage(@Part("photos") List<RequestBody> imageFiles);

YourActivity

//prepare request body
List<RequestBody> images = new ArrayList<>();
for (int i = 0; i < filePath.size(); i++){
RequestBody file = RequestBody.create(MediaType.parse("image/*"), filePath.get(i);
   images.add(file);
}

//call api
Call<ImageUploadResponse> call = imageUploadService.uploadImage(images);
  call.enqueue(new Callback<ImageUploadResponse>() {
      @Override
     public void onResponse(Call<ImageUploadResponse> call,
                         Response<ImageUploadResponse> response) {

     }

     @Override
     public void onFailure(Call<ImageUploadResponse> call, Throwable t) {

     }
});