send Image from android to MySQL server

2019-08-31 17:25发布

enter image description here

In Activity A, it has 3 listView. When submit button is clicked, I want to store the text and imagePath into MySQL and the image stored in PhotoUpload folder.

String imagess;
Uri imgURI;

 public void uploadImageAndText(ArrayList<ImageAndText> listItems, final String id) {
            JSONArray jsonArray = new JSONArray();
            try {
                for (ImageAndText i : listItems) {
                    JSONObject object = new JSONObject();
                    String type = i.getType();
                    String[] Type = type.split(":");
                    object.put("type", Type[1]);
                    Toast.makeText(getApplicationContext(), Type[1], Toast.LENGTH_LONG).show();
                    String amount = i.getAmount();
                    String[] Amount = amount.split(":");
                    object.put("amount", Amount[1]);
                    String description = i.getDescription();
                    String[] Description = description.split(":");
                    object.put("description", Description[1]);
                    Uri uploadImage = i.getImage(); //not sure
                    object.put("image", uploadImage); // not sure 
                    object.put("ts_id", id);
                    jsonArray.put(object);
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }

            AddStaff ru = new AddStaff(jsonArray);
            ru.execute();

        }

        class AddStaff extends AsyncTask<String, Void, String> {
            ProgressDialog loading;

            JSONArray jsonArray;

            AddStaff(JSONArray jsonArray) {
                this.jsonArray = jsonArray;
            }

            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                loading = ProgressDialog.show(AddClaims.this, "Please Wait", null, true, true);
            }

            @Override
            protected String doInBackground(String... params) {
                HashMap<String, String> data = new HashMap<String, String>();
                data.put("listItems", jsonArray.toString());
                data.put(Configs.KEY_IMAGE,imagess);  // not sure
                RequestHandler rh = new RequestHandler();
                String result = rh.sendPostRequest(Configs.STAFF_BENEFIT, data);
                return result;
            }

            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);
                loading.dismiss();
                Toast.makeText(getApplicationContext(), s, Toast.LENGTH_LONG).show();
            }
        }


    }

staffBenefit.php

  <?php
        if( $_SERVER['REQUEST_METHOD']=='POST' ){

            if( !empty( $_POST['listItems'] ) ){

                $mysqli = new mysqli("127.0.0.1:3307", "root", "", "androiddb");
                if( $mysqli->connect_errno ) echo "Failed to connect to MySQL";

                $image = $_POST['image'];

                $listItems = json_decode( $_POST['listItems'], true ); 

                $sql="SELECT id FROM staff_benefit ORDER BY id ASC";

                $id=0;

                $res=$mysqli->query( $sql );
                while( $rs=$res->fetch_object() ) $id=$rs->id;

                $path="$id.png";
                $actualpath="http://192.168.107.115:80/Android/CRUD/PhotoUpload/$path";

                $sql="INSERT INTO `staff_benefit` ( `type`, `amount`, `description`, `image`, `ts_id` ) VALUES ( ?, ?, ?, ?, ? )";
                $stmt=$mysqli->prepare( $sql );

                $pathelements=array( realpath( $_SERVER['DOCUMENT_ROOT'] ), 'CRUD', 'PhotoUpload', '' );
                $savepath = realpath( implode( DIRECTORY_SEPARATOR, $pathelements ) ) . "{$id}.png";

                $bytes=file_put_contents( $savepath, base64_decode( $image ) );
                if( !$bytes ){
                    echo 'Error saving image';  
                }

                if ( $stmt ) {
                     foreach( $listItems as $item ){ 

                        $stmt->bind_param('sssss', $item['type'], $item['amount'], $item['description'], $actualpath, $item['ts_id'] );
                        $res=$stmt->execute();

                        if( !$res ) echo 'Query failed with code: '.$stmt->errno;
                    } 
                }
                $mysqli->close();
            }
        }
    ?>

My app doesn't crashed, but I saw this in logCat.

01-14 02:05:11.978  20483-21081/com.example.project.myapplication W/System.err﹕ java.lang.NullPointerException
01-14 02:05:11.978  20483-21081/com.example.project.myapplication W/System.err﹕ at libcore.net.UriCodec.encode(UriCodec.java:132)
01-14 02:05:11.978  20483-21081/com.example.project.myapplication W/System.err﹕ at java.net.URLEncoder.encode(URLEncoder.java:57)
01-14 02:05:11.978  20483-21081/com.example.project.myapplication W/System.err﹕ at com.example.project.myapplication.Handler.RequestHandler.getPostDataString(RequestHandler.java:118)
01-14 02:05:11.978  20483-21081/com.example.project.myapplication W/System.err﹕ at com.example.project.myapplication.Handler.RequestHandler.sendPostRequest(RequestHandler.java:51)
01-14 02:05:11.978  20483-21081/com.example.project.myapplication W/System.err﹕ at com.example.project.myapplication.GUI.AddClaims$AddInfo$AddStaff.doInBackground(AddClaims.java:480)
01-14 02:05:11.978  20483-21081/com.example.project.myapplication W/System.err﹕ at com.example.project.myapplication.GUI.AddClaims$AddInfo$AddStaff.doInBackground(AddClaims.java:459)

Can someone please assist me how to achieve this ? How to store the URI image into folder ? Thanks.

Edited

 @Override
            protected String doInBackground(String... params) {

                for (int index = 0; index < jsonArray.length(); index++) {
                    try {
                        JSONObject jsonObject = jsonArray.getJSONObject(index);
                        String strUri = jsonObject.getString("image");
                        HashMap<String, String> data = new HashMap<String, String>();
                        data.put("listItems", jsonArray.toString());
                        data.put(Configs.KEY_IMAGE, getStringImage(Uri.parse(strUri)));
                        RequestHandler rh = new RequestHandler();
                        String result = rh.sendPostRequest(Configs.STAFF_BENEFIT, data);
                        return result;
                    } catch (Exception e) {
                    }
                }
                return "";
            }

            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);
                loading.dismiss();
                Toast.makeText(getApplicationContext(), s, Toast.LENGTH_LONG).show();
            }
        }


        public String getStringImage(Uri imgUri) {
            try {
                Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), imgUri);
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
                byte[] imageBytes = baos.toByteArray();
                String encodedImage = Base64.encodeToString(imageBytes, Base64.DEFAULT);
                return encodedImage;
            } catch (Exception e) {
            }

            return "";
        }
    }

When I check MySQL, three data get inserted but the path stored in column image is the same (the last one) and only the last image stored inside the photoUpload folder.

enter image description here

It suppose to have 36.png,37.png and 38.png, but it saved 36.png only

1条回答
萌系小妹纸
2楼-- · 2019-08-31 17:35

send Image from android to MySQL server

Getting NPE because imagess Array is null.

Because want to send multiple images from device to server. iterate over JSONArray which sending in doInBackground and get Bitmap from Uri before sending to server:

1. In uploadImageAndText method store Uri as String in JSONObject.Change:

object.put("image", uploadImage);

to

object.put("image", uploadImage.toString());

2. Create a method for getting Bitmap using Uri and encoded image String like:

public String getStringImage(Uri imgUri){
    Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(),imgUri);
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
    byte[] imageBytes = baos.toByteArray();
    String encodedImage = Base64.encodeToString(imageBytes, Base64.DEFAULT);
    return encodedImage;
}

3. Finally call getStringImage in doInBackground :

@Override
protected String doInBackground(String... params) {

  for(int index=0;index<jsonArray.length();index++){
   JSONObject jsonObject=jsonArray.getJSONObject(index);
    String strUri=jsonObject.getString("image");
    HashMap<String, String> data = new HashMap<String, String>();
    data.put("listItems", jsonArray.toString());
    data.put(Configs.KEY_IMAGE,getStringImage(Uri.parse(strUri)));  
    RequestHandler rh = new RequestHandler();
    String result = rh.sendPostRequest(Configs.STAFF_BENEFIT, data);
  }
   return "";        
 }    
查看更多
登录 后发表回答