2016-01-13 205 views
0

enter image description here發送圖像到MySQL服務器

在活動A,它有3 listView。點擊提交按鈕時,我想將文本和圖片路徑存儲到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文件夾中的相同(最後一個),只有最後一張圖像。

enter image description here

它假設有36.png,37.png和38.png,但它保存36.png只有

+2

'imagess'是'null' –

+1

使用'object.put( 「圖像」,uploadImage.toString());'代替object.put(「image」,uploadImage);' –

+0

@ρяσѕρєяK我應該爲'imagess'改變什麼? – Tony

回答

2

從機器人發送圖像到MySQL服務器

獲取NPE,因爲imagess數組是null

因爲想從設備發送多個圖像到服務器。遍歷JSONArray其發送的doInBackground發送到服務器之前得到烏里Bitmap:在JSONObject.Change

uploadImageAndText方法商店URI作爲字符串:

object.put("image", uploadImage); 

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

2.創建一個使用Uri獲取位圖的方法和編碼圖像字符串如:

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

最後調用getStringImagedoInBackground

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

取消處理異常 – Tony

+0

@Tony - 然後放一個try-catch並修復它... –

+0

@Tony:是嗎?沒有得到你當然你需要添加try-catch。我們不是在這裏提供編譯的代碼提示就足夠了 –