send Image from android to MySQL server

本小妞迷上赌 提交于 2020-01-06 20:18:23

问题


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.

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


回答1:


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 "";        
 }    


来源:https://stackoverflow.com/questions/34774015/send-image-from-android-to-mysql-server

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