2016-01-14 6 views
0

У меня есть три вида списка в активности А, как показано нижеСохранение несколько изображений в тузде PHP от андроида, но только один образом вставляется

enter image description here

При отправке button нажатии, текст и изображений путь будет сохранен в MySQL, а image будет храниться в папке PhotoUpload.

Я могу хранить 3 текста в MySQL, но проблема в том, что только один путь изображения сохраняется в MySQL. Между тем, изображение должно сохранять внутри PhotoUpload, но оно просто сохраняется за пределами папки!

Это полностью расстраивает!

активность

public void uploadImageAndText(ArrayList<ImageAndText> listItems, final String id) { // Assume id holds value 2 (ts_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(); 
        Log.e("Image",uploadImage+""); 
        object.put("image", uploadImage.toString()); 
        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) { 

       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))); 
         Log.e("AAA",jsonArray.toString()); 
         Log.e("String",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 ""; 
     } 
    } 

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=1; 

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

      $path=time()."$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 && $bytes) { 
       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(); 
     } 
    } 
?> 

Выходной

enter image description here

Я проверяю путь изображения, и три из них одинаковы! И только одно изображение (2.png) сохраняются, и он находится вне PhotoUpload, а не внутри :(

путь проблема? Проблема Java? Или проблема PHP ???

Edited (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"; 


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

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

      $id=1; 

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



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

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

      foreach($listItems as $item){ 
      $path=time()."$id.png"; 
      $actualpath="http://192.168.107.115:80/Android/CRUD/PhotoUpload/$path"; 
      $bytes=file_put_contents($savepath, base64_decode($item['image'])); 
      if(!$bytes){ 
      echo 'Error saving image'; 
      }else{ 
      $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(); 
     } 

?> 

Путь

C:\xampp\htdocs\Android\CRUD\UploadPhoto 
+0

я запуталась .. а) вы загружаете 1 изображение, и он будет ссылаться на это в 3 отдельных строк в базе данных? б) или вы загружаете 3 изображения, и вы хотите, чтобы их было 3 отдельно для каждого изображения? – Clay

+0

@ChrisBanks У меня есть 3 списка в моем спискеView. При нажатии кнопки отправки они предполагают, что они будут сохранены в MySQL. Я загружаю 3 изображения, но только один путь и изображение изображения (первое изображение) сохраняются – Tony

+0

@ChrisBanks это b – Tony

ответ

2

пихты st из всего, что вы переписываете данные изображения в вас doInBackground цикл.

Второй код загрузки PHP не в цикле

JAVA

Вы должны иметь только один цикл, когда вы строите свой JSON, положить все, что нужно там

for (ImageAndText i : listItems) { 
    JSONObject object = new JSONObject(); 

    String type = i.getType(); 
    String[] Type = type.split(":"); 
    String amount = i.getAmount(); 
    String[] Amount = amount.split(":"); 
    String description = i.getDescription(); 
    String[] Description = description.split(":"); 

    //Image 
    String image = i.getImage().toString() 
    Uri imageUri = Uri.parse(image); 

    object.put("amount", Amount[1]); 
    object.put("type", Type[1]); 
    object.put("description", Description[1]); 
    object.put("ts_id", id); 
    object.put("image", image); 
    object.put(Configs.KEY_IMAGE, getStringImage(imageUri)); 

    jsonArray.put(object); 
} 

Затем введите JSON в hashmap, чтобы отправить

@Override 
protected String doInBackground(String... params) { 
    try { 
     HashMap<String, String> data = new HashMap<String, String>(); 
     data.put("listItems", jsonArray.toString()); 

     RequestHandler rh = new RequestHandler(); 
     String result = rh.sendPostRequest(Configs.STAFF_BENEFIT, data); 
     return result; 
    } catch (Exception e) { 
     return ""; 
    } 
} 

PHP

РНР изменится, вам не нужно будет $image = $_POST['image'];

Вы получите данные изображения из JSON $listItems = json_decode($_POST['listItems'], true);

Вы бы поместить код загрузки в цикле, и вставить только на успешной загрузки

foreach($listItems as $item){ 
    $path=time()."$id.png"; 
    $actualpath="http://192.168.107.115:80/Android/CRUD/PhotoUpload/$path"; 
    $bytes=file_put_contents($savepath, base64_decode($item['image'])); 
    if(!$bytes){ 
     echo 'Error saving image'; 
    }else{ 
     $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; 
    } 
} 

EDIT:

Полный PHP скрипт

<?php 
    if($_SERVER['REQUEST_METHOD']=='POST'){ 
     if(!empty($_POST['listItems'])){ 
      $listItems = json_decode($_POST['listItems'], true); 
      $mysqli = new mysqli("127.0.0.1:3307", "root", "", "androiddb"); 
      if($mysqli->connect_errno) echo "Failed to connect to MySQL"; 
      $sql="INSERT INTO `staff_benefit` 
       (`type`, `amount`, `description`, `image`, `ts_id`) 
        VALUES (?, ?, ?, ?, ?)"; 
      if($stmt=$mysqli->prepare($sql)){ 
       $url="http://192.168.107.115:80/Android/CRUD/PhotoUpload/"; 
       foreach($listItems as $item){ 
        $image_name = time().".png"; 
        $save_path = 'PhotoUpload/'.$image_name; 
        $image_url = $url.$image_name; 
        $bytes=file_put_contents($save_path, base64_decode($item['image'])); 
        if(!$bytes){ 
         echo 'Error saving image'; 
        }else{ 
         $stmt->bind_param('sssss', 
         $item['type'], 
         $item['amount'], 
         $item['description'], 
         $image_url, 
         $item['ts_id']); 
         if(!$res=$stmt->execute()){ 
          echo 'Query failed with code: '.$stmt->errno; 
         } 
        } 
       } 
      } 
      $mysqli->close(); 
     } 
    } 
?> 
+0

Я все равно получаю тот же результат, и только последнее изображение вставлено. Изображение просто хранится за пределами папки – Tony

+0

@Tony 'Log.d (« log »,« json = »+ jsonArray.toString());' что вы видите ? – meda

+0

'D/войти: JSON = [{ "количество":» " "образ":" \/9j \/4AAQSkZJRgABAQAAAQABAAD \/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB \ nAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH \/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEB \ nAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH \/wAARCAUAAtADASIA \ nAhEBAxEB \/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL \/8QAtRAAAgEDAwIEAwUFBAQA \ nAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 \ nODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm \ n' – Tony