2017-06-01 19 views
1

我需要上传服务器上的图像数组使用多部分。我也想给该数组的密钥,否则服务器无法识别数组。我曾尝试解决以下,但这些不工作: 解决方法1上传图像的多部分改造2

MultipartBody.Part[] array = new MultipartBody.Part[items.size()]; 
      for(int i=0;i<items.size();i++){ 
       File file = new File(items.get(i)); 
       RequestBody requestBody = RequestBody.create(MediaType.parse("image/*"), file); 
       MultipartBody.Part filePart = MultipartBody.Part.createFormData("value_" 
           + String.valueOf(uploadMissionRequestModel.getStepId()), file.getName(), 
         requestBody); 
       array[i]=filePart; 
      } 

RequestBody apiKey = RequestBody.create(MediaType.parse("text/plain"), 
       uploadMissionRequestModel.getApiKey()); 
     RequestBody stepId = RequestBody.create(MediaType.parse("text/plain"), 
       String.valueOf(uploadMissionRequestModel.getStepId())); 
     RequestBody missionId = RequestBody.create(MediaType.parse("text/plain"), 
       String.valueOf(uploadMissionRequestModel.getMissionId())); 
     RequestBody overWrite = RequestBody.create(MediaType.parse("text/plain"), 
       "yes"); 

     Map<String, RequestBody> partMap = new HashMap<>(); 
     partMap.put("api_token", apiKey); 
     partMap.put("MissionID", missionId); 
     partMap.put("overwrite", overWrite); 
     partMap.put("StepID", stepId); 

ApiServices service = RestClient.getClient(); 
     final Call<UploadMissionResponse> call = service.uploadFiles(partMap, array); 

溶液2

RequestBody[] image_id = new RequestBody[items.size()]; 
     for(int i=0;i<items.size();i++){ 
      File file = new File(items.get(i)); 
      RequestBody requestBody = RequestBody.create(MediaType.parse("image/*"), file); 
      image_id[i]=requestBody; 

     } 
RequestBody apiKey = RequestBody.create(MediaType.parse("text/plain"), 
       uploadMissionRequestModel.getApiKey()); 
     RequestBody stepId = RequestBody.create(MediaType.parse("text/plain"), 
       String.valueOf(uploadMissionRequestModel.getStepId())); 
     RequestBody missionId = RequestBody.create(MediaType.parse("text/plain"), 
       String.valueOf(uploadMissionRequestModel.getMissionId())); 
     RequestBody overWrite = RequestBody.create(MediaType.parse("text/plain"), 
       "yes"); 

     Map<String, RequestBody> partMap = new HashMap<>(); 
     partMap.put("api_token", apiKey); 
     partMap.put("MissionID", missionId); 
     partMap.put("overwrite", overWrite); 
     partMap.put("StepID", stepId); 

     Map<String, RequestBody[]> imageMap = new HashMap<>(); 
     imageMap.put("value_8",image_id); 

ApiServices service = RestClient.getClient(); 
     final Call<UploadMissionResponse> call = service.uploadFiles(partMap, imageMap); 

请建议,如何传递图像阵列使用retrofit2键名。

回答

0

如果我是你,我会将图像转换为Base64,并使用第二种解决方案将List<String>发送给图像。

1

我的请求方法:

@Multipart 
@POST("admin/assets/upload/") 
Observable<UploadResponse> uploadFiles(@Part MultipartBody.Part... files); 

从URI的阵列创建零件。所有部件将有重点 '的文件[]',一个我认识到后端:

//UriHandle and OkioUtil are my own classes to handle both 'content' and 'file' uris 
//files has type of Uri[] 
final MultipartBody.Part[] parts = new MultipartBody.Part[files.length]; 
for (int i = 0; i < files.length; i++) { 
    final UriHandle handle = UriUtil.getUriHandle(context, files[i]); 
    final RequestBody body = OkioUtil.create(handle, mediaType); 
    parts[i] = MultipartBody.Part.createFormData("files[]", handle.name(), body); 
} 

发送请求:

api.uploadFiles(part) 
    .subscribeOn(...) 
    .observeOn(...) 
    .subscribe(result -> ...); 
+0

非常感谢你。你拯救了我的一天。 – oalpayli