2017-06-01 15 views
1

マルチパーツを使用してサーバー上に画像の配列をアップロードする必要があります。また、その配列にキーを渡します。そうでなければサーバーは配列を認識しません。私は以下のソリューションを試してみましたが、これらは動作しません: ソリューション1マルチパート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); 

対処方法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に変換し、2番目の解決策を使用して画像にList<String>を送信します。

1

マイリクエスト方法:

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

は、URI年代の配列からパーツを作成します。すべての部品は、キー 'ファイルを[]' を持つことになります、私のバックエンドが認識する1:

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

関連する問題