2017-06-01 2 views
1

Ich muss ein Array von Bildern auf Server mit Multi-part.and hochladen Ich möchte auch Schlüssel zu diesem Array geben, sonst erkennt Server das Array nicht. Ich habe die folgenden Lösungen ausprobiert, aber diese funktionieren nicht: Solution1:Upload-Array von Bildern in Multipart-Retrofit2

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

Solution2

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

Bitte legen nahe, Wie kann ich mit Tastenfeld von Bildern passieren Namen retrofit2 .

Antwort

0

Wenn ich Sie wäre Ich würde Bilder in Base64 konvertieren und senden Sie List<String> für Bilder mit Ihrer zweiten Lösung.

1

Meine Anfrage Methode:

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

Erstellen von Teilen aus dem Array von URIs. Alle Teile müssen Schlüssel 'Dateien []', die man mein Backend erkennt:

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

Senden Anfrage:

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

Ihnen sehr danken. Du hast meinen Tag gerettet. – oalpayli