【问题标题】:How to pass String and File data with Volley POST method in Android?如何在 Android 中使用 Volley POST 方法传递字符串和文件数据?
【发布时间】:2017-11-14 17:09:01
【问题描述】:

我正在使用 Volley 发出服务器请求,但我知道 volley 没有在 POST 请求中从 getParams() 方法传递参数,所以现在我通过将所有参数/值与下面的 url 连接来传递这些数据。

String url = "http://myweb/api/work?"+param1+"="+value;

现在的问题是它仅适用于文本数据,我可以成功发出请求,并且所有参数都传递到服务器,但现在我也必须使用相同的 api 上传一些图像文件。

如何使用 Volley POST 方法传递文件和字符串数据?

以下是我尝试但没有成功的解决方案。 https://gist.github.com/anggadarkprince/a7c536da091f4b26bb4abf2f92926594#file-volleymultipartrequest-java

https://www.simplifiedcoding.net/android-volley-tutorial-to-upload-image-to-server/

编辑 以下是我当前的请求代码:

StringRequest request = new StringRequest(Request.Method.POST, uri + param, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            dismissProgressDialog();
            printResponse(response);

        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            dismissProgressDialog();
            error.printStackTrace();

        }
    }) {

        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            HashMap<String, String> headers = new HashMap<>();
            headers.put("key", key);
            headers.put("tkey", tkey);
            headers.put("Content-Type", "application/multipart");
            return headers;
        }
    };

【问题讨论】:

  • 你可以将图片作为base64作为字符串传递
  • 你的 API 是多部分的吗?如果是,那么您可以将文件作为 API 请求的多部分正文发送,如果不是,您怎么能考虑将文件作为参数或字符串正文发送。
  • @Avi 是的,它是多部分的。
  • 如果您的 api 支持多部分,那么您可以从以下位置获得帮助:- gist.github.com/anggadarkprince/…
  • @JaydeepPatel 谢谢,你有任何示例代码或参考吗?

标签: android http-post android-volley


【解决方案1】:

使用以下代码

VolleyMultipartRequest multipartRequest = new VolleyMultipartRequest(Request.Method.POST, url, new Response.Listener<NetworkResponse>() {
    @Override
    public void onResponse(NetworkResponse response) {
        String resultResponse = new String(response.data);
        // parse success output
    }
}, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {                
        error.printStackTrace();
    }
}) {
    @Override
    protected Map<String, String> getParams() {
        Map<String, String> params = new HashMap<>();
        params.put("name", "Sam");
        params.put("location", "India");
        params.put("about", "UI/UX Designer");
        params.put("contact", "xyz@email.com");
        return params;
    }

    @Override
    protected Map<String, DataPart> getByteData() {
        Map<String, DataPart> params = new HashMap<>();
        // file name could found file base or direct access from real path
        // for now just get bitmap data from ImageView
        params.put("avatar", new DataPart("file_avatar.jpg", AppHelper.getFileDataFromDrawable(getBaseContext(), mAvatarImage.getDrawable()), "image/jpeg"));
        params.put("cover", new DataPart("file_cover.jpg", AppHelper.getFileDataFromDrawable(getBaseContext(), mCoverImage.getDrawable()), "image/jpeg"));

        return params;
    }
};

VolleySingleton.getInstance(getBaseContext()).addToRequestQueue(multipartRequest);

【讨论】:

  • 我已经用过那个类了,但即使是字符串参数也不是从“getParams()”方法传递过来的
  • 你如何也展示 VolleyMultipartRequest 类
【解决方案2】:
VolleyMultipartRequest multipartRequest = new VolleyMultipartRequest(com.android.volley.Request.Method.POST, url, new Response.Listener<NetworkResponse>() {

        @Override
        public void onResponse(NetworkResponse response) {
        }

    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
        }
    })
    {
        //pass String parameters here
        @Override
        protected Map<String, String> getParams() {
            Map<String, String> params = new HashMap<>();
            params.put("category", "image");
            params.put("p_name", "myImage");
            return params;
        }

        //pass header
        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            Map<String, String> headers = new HashMap<String, String>();

            headers.put("key", key);
            headers.put("tkey", tkey);
            headers.put("Content-Type", "application/multipart");

            return headers;
        }

        //pass file here (*/* - means you can pass any kind of file)
        @Override
        protected Map<String, VolleyMultipartRequest.DataPart> getByteData() {
            Map<String, DataPart> up_params = new HashMap<>();
            up_params.put("params", new DataPart(file_path, file_name, "*/*"));

            return up_params;
        }
    };      
 VolleySingleton.getInstance(getBaseContext()).addToRequestQueue(multipartRequest);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-14
    • 2020-12-13
    相关资源
    最近更新 更多