在Volley Request中将图像与其他参数一起发送

时间:2018-10-10 15:18:20

标签: android android-volley multipart

我正在使用截击请求向服务器发送一个带有两个参数的请求,并且工作正常。现在,要求已更改,我需要将至少一个图像或最多3个图像以及其他两个参数发送到服务器。图像必须作为多部分发送。我有以下代码用于从图库中获取图像并将其文件路径存储在列表中。

List<String> imagePathList = imageFilePaths;
        List<MultipartBody.Part> partMap = new ArrayList<>();
        for (int i = 0; i < imagePathList.size(); i++) {
            Uri fileUri = Uri.parse(imagePathList.get(i));
            RequestBody requestFile = RequestBody.create(
                    MediaType.parse(getMimeTypee(FileUtils.getFile(getContext(), fileUri).getAbsolutePath())),
                    FileUtils.getFile(getContext(), fileUri)
            );

           MultipartBody.Part body = MultipartBody.Part.createFormData("court_image[" + i + "]", FileUtils.getFile(getContext(), fileUri).getName(), requestFile);
           partMap.add(body);
        }

其中imageFilePaths是一个数组列表。服务器将接收图像,例如court_image [0],court_image [1]等,这取决于我在arraylist中有多少个图像路径。

齐射要求在这里:

 RequestQueue queue = Volley.newRequestQueue(getContext());
        StringRequest postRequest = new StringRequest(Request.Method.POST, url1,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        Toast.makeText(mBaseAppCompatActivity, "Success", Toast.LENGTH_SHORT).show();
                   }
                },
                new Response.ErrorListener() {

                    @Override
                    public void onErrorResponse(VolleyError error) {

                    }
                }
        ) {

            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                Map<String, String> params = new HashMap<String, String>();
                String token = getToken();
                params.put("Authorization", "Bearer " + token);
                params.put("Content-Type", "multipart/form-data");
                return params;
            }

            @Override
            protected Map<String, String> getParams() {
                Map<String, String> params = new HashMap<String, String>();
                params.put("terms", "true");
                params.put("phone", "phoneNo");
                return params;
            }

        };
        queue.add(postRequest);

现在这是我对多部分内容的新手,借助它,我能够从图库中获取图像并将其路径存储在ArrayList中,但是我不知道如何在其中传递多部分数据排球要求。请帮助

1 个答案:

答案 0 :(得分:0)

尽管这是一个古老的问题,但我认为我应该在此处发布答案,因为我遇到了同样的问题,并且可以设法解决该问题。

为了上载图像以及其他一些参数,我使用了齐射。但是,我发现了原始齐射库的包装器,该包装器更易于集成到多部分请求中。因此,我在build.gradle文件中添加了以下库。

dependencies {
    compile 'dev.dworks.libs:volleyplus:+'
}

我从build.gradle 中删除了原始的凌空库,并改用了上述库,该库可以处理具有类似集成技术的多部分请求和常规请求。

然后,我只需要编写以下类来处理POST请求操作。

public class POSTMediasTask {
    public void uploadMedia(final Context context, String filePath) {

        String url = getUrlForPOSTMedia(); // This is a dummy function which returns the POST url for you
        SimpleMultiPartRequest multiPartRequestWithParams = new SimpleMultiPartRequest(Request.Method.POST, url,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        Log.d("Response", response);
                        // TODO: Do something on success
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                // TODO: Handle your error here
            }
        });

        // Add the file here
        multiPartRequestWithParams.addFile("file", filePath);

        // Add the params here
        multiPartRequestWithParams.addStringParam("terms", "SomeTerms");
        multiPartRequestWithParams.addStringParam("phone", "85050055055");

        RequestQueue queue = Volley.newRequestQueue(context);
        queue.add(multiPartRequestWithParams);
    }
}

现在执行如下任务。

new POSTMediasTask().uploadMedia(context, mediaPath);

您可以使用此库一次上传一个文件。但是,我可以通过启动多个任务来设法上传多个文件。

希望有帮助!