2

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

--------------------------219391268715340 内容处置:表单数据;名称="照片[]"; 文件名="DSCF0157-Laptop.JPG" 内容类型:图像/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 应用程序使用,它可以正常工作。知道我做错了什么

4

2 回答 2

2

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

改造 - 多部分请求:所需的 MultipartFile 参数“文件”不存在

经过一些修改:

WebAPIService.java:

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

文件活动.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());
    }
});

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

希望能帮助到你!

于 2016-04-09T09:17:10.397 回答
0

也许你可以这样做。

YourAPIService

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

你的活动

//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) {

     }
});
于 2016-06-10T07:46:17.243 回答