如何在OkHttpClient中将对象(即UserData)类型的列表添加到MultipartBody

时间:2018-09-26 14:47:41

标签: android json okhttp okhttp3

我有一个对象的ArrayList,我需要将其放入MultipartBody.Builder。我尝试使用.addFormDataPart的不同方法,但无法正常工作。这就是我将其放入请求中的方式。任何帮助,将不胜感激。谢谢

我在服务器上的JSON格式如下

 {
      "formData": [
        {
          "name": "string",
          "value": {
            any-object(string,file,long....etc)
          }
        }
      ],
      "tripId": "string"
    }

这就是我的做法

private RequestBody getMultipartData(Object postData) {
        MultipartBody.Builder formBody = new MultipartBody.Builder();
        formBody.setType(MultipartBody.FORM);

        ArrayList<UserData> arrayList = null;
        if (postData instanceof OnboardPresenterImpl.TripRequest) {
            OnboardPresenterImpl.TripRequest tripRequest = ((OnboardPresenterImpl.TripRequest) postData);
            formBody.addFormDataPart("tripId", tripRequest.getTripId());
            arrayList = tripRequest.getFormData();

        } 

        if (arrayList != null && arrayList.size() > 0) {
            for (int i = 0; i < arrayList.size(); i++) {

                UserData userData = arrayList.get(i);

                String value = userData.getValue().toLowerCase();

                if (value.contains("/") && (value.contains(".png") ||
                        value.contains(".jpeg") || value.contains(".jpg"))) {

                    MediaType type = Util.getMediaType(value);

                    File sourceFile = new File(value);

                    if (sourceFile.exists()) {

                        formBody.addFormDataPart(userData.getName(),
                                sourceFile.getName(),RequestBody.create(type, sourceFile));

                    }
                } else {
                    formBody.addFormDataPart(userData.getName(), value);
                }
            }
        }

       return formBody.build();
    }

1 个答案:

答案 0 :(得分:0)

几天后,我找出了解决方案

String uploadMultipleFiles(Api api, HashMap<String, ArrayList<File>> fileListMap)
            throws IOException {

        String responseS;
        OkHttpClient timeOut = getOkHttpClient(api.getTimeOut());

        MultipartBody.Builder multipartBuilder = new MultipartBody.Builder()
                .setType(MultipartBody.FORM);
        int j = 0;
        ArrayList<File> fileList;
        for (Map.Entry<String, ArrayList<File>> entry : fileListMap.entrySet()) {
            String key = entry.getKey();
            fileList = entry.getValue();

            multipartBuilder.addFormDataPart("data[" + j + "].name", key);

            if (fileList != null) {
                for (int i = 0; i < fileList.size(); i++) {

                    File fileListRequest = fileList.get(i);

                    if (fileListRequest.exists()) {
                        String ext = CommonUtils.getExtension(fileListRequest.getName());
                        /* Changing Media Type whether JPEG or PNG **/
                        final MediaType MEDIA_TYPE = ext.endsWith("png") ? MEDIA_TYPE_PNG :
                                ext.endsWith("jpg") ? MEDIA_TYPE_JPG : MEDIA_TYPE_JPEG;

                        multipartBuilder.addFormDataPart("data[" + j + "].files[" + i + "]",
                                fileListRequest.getName(),
                                RequestBody.create(MEDIA_TYPE, fileListRequest));

                    }
                }
            }
            j++;
        }
        RequestBody requestBody = multipartBuilder.build();
        Request.Builder requestBuilder = new Request.Builder()
                .url(Objects.requireNonNull(api.getUrl()))
                .post(requestBody);
        buildHeaders(requestBuilder);
        Response response = timeOut.newCall(requestBuilder.build()).execute();
        responseS = response.body().string();
        Log.i(api.getName().name(), responseS);
        return responseS;
    }