使用从Mysql到Android的base64更好地理解

I got confused on the conversion from PHP/JSON, where the imagename(from Mysql) is printed as a long series of characters echo json_encode($response); but in echo '<img src... an image has been displayed. TAG_IMAGE_NAME will contain the Byte Array in String from JSONArray['imageName'] and Include the Image in the Hashmap.


What I wanted is to convert IT(returned from JSONObject 'imagename' using java) to images then store it in the sd card and Populate the image in the listView. Sorry for being confused. Thanks for your consideration.

Table: imagename

2 | (Binary/Image)  | 32byte    

3 | (Binary/Image)  | 9byte

Php/JSON:

        while ($row = mysql_fetch_array($result)) {
        // temp user array
        $product = array();
        $product["pid"] = $row["groupId"];
        $product["name"] = $row["description"];
        $img = $row["imageName"];
        $b64img = base64_encode ($img);
        $b64img = mysql_real_escape_string($b64img);
        $product["imageName"] = $b64img;
        //echo '<img src="data:image/jpg;base64,' .  base64_encode($img)  . '" />';
        }

....

// echoing JSON response
echo json_encode($response);
{"products":[{"pid":"BEER","name":"sample","imageName":"\/9j\/4AAQSkZJRgABAQEAAAAAAAD...."}]}

Android/Java/JSONParser:

protected String doInBackground(String... args) {

.
.
.
String TAG_IMAGE_NAME = "imageName"; //WILL contain the Byte Array in String

                    for (int i = 0; i < products.length(); i++) {
                    JSONObject c = products.getJSONObject(i);

                    // Storing each json item in variable
                    String id = c.getString(TAG_PID);
                    String name = c.getString(TAG_NAME);
           //Confused with this part
                    byte[] decodedString = Base64.decode(c.getString(TAG_IMAGE_NAME), Base64.DEFAULT);
                    Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);

                   // creating new HashMap
                    HashMap<String, String> map = new HashMap<String, String>();

                    // adding each child node to HashMap key => value
                    map.put(TAG_PID, id);
                    map.put(TAG_NAME, name);

                    // adding HashList to ArrayList
                    productsList.add(map);
                    }

protected void onPostExecute(String file_url) {
            // dismiss the dialog after getting all products
            pDialog.dismiss();
            // updating UI from Background Thread
            runOnUiThread(new Runnable() {
                public void run() {
                    /**
                     * Updating parsed JSON data into ListView
                     * */
                    ListAdapter adapter = new SimpleAdapter(
                            MainActivity.this, productsList,
                            R.layout.list_item, new String[] { TAG_PID,
                                    TAG_NAME},
                            new int[] { R.id.pid, R.id.name , R.id.list_image});
                    // updating listview
                    setListAdapter(adapter);
                }
            });

        }

The decodedString will be the image name. You can create a string from it if you want like:

byte[] decodedString = Base64.decode(c.getString(TAG_IMAGE_NAME), Base64.DEFAULT);
String image = new String(decodedString);

You are creating a bitmap image from just the imagename which will not work. This needs to be the actual image NOT the image name.

Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);

The php code that encodes it to base64 is commented out, but the java code is still decoding the imageName, is that on purpose.

It should be noted that json_encode will work fine as long as the field in the database is UTF-8. If the field is UTF-8 then you should need to do any encoding whatsoever and the java parser can just pull out the imagename like the other fields.