отправить изображение с android на сервер MySQL

введите описание изображения здесь

В действии A он имеет 3 listView . Когда нажата кнопка отправки, я хочу сохранить текст и imagePath в MySQL и изображение, сохраненное в папке PhotoUpload.

 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(); } } ?> 

Мое приложение не разбилось, но я видел это в 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) 

Может кто-нибудь, пожалуйста, помогите мне, как этого достичь? Как сохранить изображение URI в папке? Благодарю.

отредактированный

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

Когда я проверяю MySQL, встают три данных, но путь, хранящийся в изображении столбца, тот же (последний) и только последнее изображение, хранящееся в папке photoUpload.

введите описание изображения здесь

Предположим, что он имеет 36.png, 37.png и 38.png, но он сохранил только 36.png