如何使用volley将base64字符串发送到服务器

时间:2017-03-01 16:22:36

标签: java android bitmap android-volley

我在android中使用volley库来调用我们的服务器,当尝试将base64编码的图像发送到服务器请求失败但是当删除编码的字符串时请求成功没有任何问题。 我使用以下代码对我的图像进行编码

  public static String imgToBase64(Bitmap bitmap) {
ByteArrayOutputStream out = null;
try {
  out = new ByteArrayOutputStream();
  bitmap.compress(Bitmap.CompressFormat.JPEG, 50, out);
  out.flush();
  out.close();
  byte[] imgBytes = out.toByteArray();
  return Base64.encodeToString(imgBytes, Base64.DEFAULT);
} catch (Exception e) {
  return null;
} finally {
  try {
    out.flush();
    out.close();
  } catch (IOException e) {
    e.printStackTrace();
  }
}

}

和使用以下左轮次发送请求发送请求

public void sendDataToServer(final ApiResponse.Listener<JSONObject> listener, final ApiResponse.ErrorListener errorListener, String image) {
String url = String.format(ASK, image);
url = URLEncoder.encode(url);
JsonRequest sendRequest = new JsonRequest(Request.Method.POST, url,
        new Response.Listener<JSONObject>() {
          @Override
          public void onResponse(JSONObject response) {
            listener.onResponse(response);
          }
        }, new Response.ErrorListener() {
  @Override
  public void onErrorResponse(VolleyError error) {
    if (error != null) {
      if (error.networkResponse != null) {
        errorListener.onErrorResponse(error.networkResponse.statusCode, null);
      } else {
        errorListener.onErrorResponse(500, null);
      }
    }
  }
});
RequestPipeline.getInstance(mContext).addToRequestQueue(sendRequest);

}

1 个答案:

答案 0 :(得分:1)

查看代码,您似乎尝试将整个编码图像作为URL的一部分传递。显然这会失败,因为服务器通常不支持超过几千个符号的URL。要将长数据传递到服务器,您应该使用POST的主体。我不知道你的JsonEmptyResponseRequest类是什么以及服务器期望的格式(如何指定ASK)。只是为了让您了解如何实施

StringRequest sendRequest = new StringRequest(Request.Method.POST, url,
        new Response.Listener ...,
        new Response.ErrorListener...){

  @Override
  protected Map<String, String> getParams() throws AuthFailureError {
      Map<String, String> params = new HashMap<String, String>();
      params.put(IMAGE_PARAM_NAME, image);
      return params;
  }
};

在现实生活中,您可能希望创建自己的Request<T>子类,并将图像作为构造函数参数传递,并隐藏服务器在该类中所期望的详细信息。请注意,JsonRequest会覆盖getBodygetBodyContentType以使用JSON,因此这不适用于JsonRequest子类。