Send a Base64 encoded image through HTTP Post Request from Android

浪尽此生 提交于 2019-12-04 13:34:52

I wrote a small app that allowed for sending images taken with the phone's camera to a database. Here's how I solved the thing...

public void writeCommentForRestaurant(int id, String comment, String author,
        Bitmap image) {

    if (image != null) {
        /* Get the image as string */
        // Normal
        ByteArrayOutputStream full_stream = new ByteArrayOutputStream();
        image.compress(Bitmap.CompressFormat.PNG, 100, full_stream);
        byte[] full_bytes = full_stream.toByteArray();
        String img_full = Base64.encodeToString(full_bytes, Base64.DEFAULT);
        // Thumbnail
        ByteArrayOutputStream thumb_stream = new ByteArrayOutputStream();
                    // The getScaledBitmap method only minimizes the Bitmap to a small icon!
        getScaledBitmap(image, 72).compress(Bitmap.CompressFormat.JPEG, 75,
                thumb_stream);
        byte[] thumb_bytes = thumb_stream.toByteArray();
        String img_thumbnail = Base64.encodeToString(thumb_bytes, Base64.DEFAULT);

        // new HTTPWorker(ctx, mHandler, HTTPWorker.WRITE_COMMENT, true).execute(
        // Integer.toString(id), comment, author, img_thumbnail, img_full);
    } else {
        // new HTTPWorker(ctx, mHandler, HTTPWorker.WRITE_COMMENT, true).execute(
        // Integer.toString(id), comment, author, null, null);
    }
}

The HTTPWorker is just an asynctask that constructs the HTTPmethod.

...
/* Add arguments */
arguments.add(new BasicNameValuePair("idrestaurant", params[0]));
arguments.add(new BasicNameValuePair("comment", params[1]));
arguments.add(new BasicNameValuePair("author", params[2]));
if (params.length > 3) {
  arguments.add(new BasicNameValuePair("image", params[3]));
  arguments.add(new BasicNameValuePair("bigimage", params[4]));
}
...

And then I sent it to the server like this.

/**
* Executes a httppost to a server instance with the given POST arguments
* and returns a String response from the server.
*/
private String httppost(String url, ArrayList<NameValuePair> args) {
  /* Create the channel for communicaton */
  InputStream is = null;

  /* Send request to server */
  try {
    /* Create the POST */
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost(url);

    /* Add the login information "POST" variables in the php */
    httppost.setEntity(new UrlEncodedFormEntity(args));

    /* Execute the http POST and get the response */
    HttpResponse response = httpclient.execute(httppost);
    HttpEntity entity = response.getEntity();
    is = entity.getContent();
  } catch (Exception e) {
    Log.e(TAG, "Error in http connection " + e.toString());
    return null;
  }

  /* Read response from server */
  try {
    /* Read the response stream */
    BufferedReader reader = new BufferedReader(new InputStreamReader(
    is, "iso-8859-1"), 8);

    /* Copy the response to StringBuilder */
    StringBuilder sb = new StringBuilder();
    String line = null;
    while ((line = reader.readLine()) != null) {
      sb.append(line + "\n");
    }
    is.close();

    /* Return the response as string */
    return sb.toString();
  } catch (Exception e) {
    Log.e(TAG, "Error converting result " + e.toString());
    return null;
  }
}

Well thank you. Actually, the problem was from the server. The base64 is sent to a php script which stores the string into a field... which was a longtext type (mysql). The thing is that corrupts the data, I changed it to blob and it worked fine. Typical isn't it ?

Thanks a lot for your help.

My first topic and a great community is here that's great.

See you later.

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