How to add list of Object (i.e UserData) type to MultipartBody in OkHttpClient

◇◆丶佛笑我妖孽 提交于 2019-11-27 08:44:04

问题


I have an ArrayList of Object that I need to put into my MultipartBody.Builder.I have tried using different methods of .addFormDataPart but not working. This is how I'm putting it into the request. Any help would be appreciated. Thanks

My JSON on the server is formatted like this

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

This is how I am doing it

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:


After a few days, I figure out the solution

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


来源:https://stackoverflow.com/questions/52520520/how-to-add-list-of-object-i-e-userdata-type-to-multipartbody-in-okhttpclient

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!