2016-01-13 154 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。我们不是在这里提供编译的代码提示就足够了 –