2015-04-20 5 views
0

Я хочу отправлять сообщения с прикрепленными файлами с помощью asyncTask, мой php-код в порядке .. потому что при загрузке небольших файлов размером все будет в порядке, и когда я отправлю сообщения с прикреплением, все будет так, как я хочу. но при загрузке файла с большим размером (например, APK файлов, которые> 6 Mb) я получил исключения нулевого указателя в этой строке: (смотрите в onPostExecute)Android NullPointer Exception AsyncTask

   success2 = json2.getInt("success"); 

вот asyncTasck

public class PostDataAsyncTask extends AsyncTask<String, String, String> { 

    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 

    @Override 
    protected String doInBackground(String... strings) { 
       try { 
     uploadFile(fichier); 
     } catch (NullPointerException e) { 
      e.printStackTrace(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 


     return null; 
    } 

    @Override 
    protected void onPostExecute(String lenghtOfFile) { 
     int success2= 0; 
     try { 
      success2 = json2.getInt("success"); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     if(success2==1) { 
      ((EditText) findViewById(R.id.etMsg)).setText(""); 
      if (attach) { 
       changerAttach(); 
       }  } 
    } } 

и здесь есть функция functopn:

private void uploadFile(String filePath) { 
    try { 
     try { 

      HttpPost httpost = new HttpPost(url_upload); 
      MultipartEntity entity = new MultipartEntity(); 
      entity.addPart("Mdp", new StringBody(mdp)); 
      entity.addPart("Msg", new StringBody(URLEncoder.encode(msg))); 
      entity.addPart("type", new StringBody(type)); 
      if(type.equals("1")) { 
       entity.addPart("Emailm", new StringBody(email)); 
       entity.addPart("Emailp", new StringBody(emaildest)); 
      }else { 
       entity.addPart("Emailp", new StringBody(email)); 
       entity.addPart("Emailm", new StringBody(emaildest)); 
      } 
      if (attach){ 
       entity.addPart("attachement", new FileBody(new File(filePath))); 
       entity.addPart("attacher", new StringBody("oui")); 
      }else{ 
       entity.addPart("attacher", new StringBody("non")); 
      } 

      httpost.setEntity(entity); 
      HttpResponse response; 
      HttpClient httpclient = new DefaultHttpClient(); 
      response = httpclient.execute(httpost); 

      if (response != null) { 
       HttpEntity entity2 = response.getEntity(); 
       String responseString = EntityUtils.toString(entity2, "UTF-8"); 
       System.out.println(responseString); 
       json2=new JSONObject(responseString); 

      } else { //erreur 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    }catch (Exception e){ 

    } 
} 

Примечание струнный «Fichier» путь к файлу, который я хочу аплоад.

attach - это логическая переменная, которая означает, что я выбрал файл для загрузки или нет.

json2 является глобальной переменной (JSONObject), который будет парафировано в функции загрузки

я думаю, что это то, что вам нужно (код PHP в порядке)

Примечание: я думаю, что Сознание является причиной моей проблемы, так это верно? Большое спасибо

EDIT upload.php

<?php 
date_default_timezone_set ("Africa/Algiers"); 
include('connect.php'); 
$response = array(); 

if (isset($_REQUEST['Emailm'])&& isset($_REQUEST['Mdp'])&&isset($_REQUEST['type']) && isset($_REQUEST['Emailp'])&&isset($_REQUEST['Msg']) ) { 


    $Emailm = $db->real_escape_string($_REQUEST['Emailm']); 
    $Emailp = $db->real_escape_string($_REQUEST['Emailp']); 
    $Mdp = $db->real_escape_string($_REQUEST['Mdp']); 
    $Msg = $_REQUEST['Msg']; 
    $Mdp = $_REQUEST['Mdp']; 
    $Msg= $db->real_escape_string(htmlentities(urldecode($Msg)));  
    $type= $_REQUEST['type']; 
    $target_path1 = "attachement/"; 
    if($type=="0"){ //compte patient 
    if ($result = $db->query("SELECT * FROM `patient` WHERE `Email_p`='$Emailp' AND `Mdp`='$Mdp'")) { 
    $row_cnt = $result->num_rows; } 
    }else { //compte médecin 
    if ($result = $db->query("SELECT * FROM `med` WHERE `Email`='$Emailm' AND `Mdp`='$Mdp'")) { 
    $row_cnt = $result->num_rows; } 
    } 


    $b=false; 
    $a=false; 

    if ($row_cnt>0) { 
       if($_REQUEST['attacher']=="oui"){ 
       $filecount = 0; 
       $files = glob($target_path1 . "*"); 
       if ($files){ 
       $filecount = count($files); 
       } 
       $nomFichier=$filecount.basename($_FILES['attachement']['name']) ; 
       $target_path1 = $target_path1 . $nomFichier; 
       $nomFichierOrigin=basename($_FILES['attachement']['name']); 
       if(move_uploaded_file($_FILES['attachement']['tmp_name'], $target_path1)) { 
       $b=true;} 
       } 
       else{ 
       $nomFichier=""; 
       $nomFichierOrigin=""; 
       }; 

         $h=new DateTime("now") ; 
         $s=$h->format('G:i:s'); 
         $s2=$h->format('Y-m-d'); 
        if($result = mysqli_query($db,"INSERT INTO `msg`(`cle`, `email_m`, `email_p`, `message`, `attachement`, `type`, `attachementNomOrigin`, `heure`, `date`,`vu`) 
        VALUES ('','$Emailm','$Emailp','$Msg','$nomFichier','$type','$nomFichierOrigin','$s','$s2','non')")) 
        {$a=true;} 

        if($a==true && $b==true && $_REQUEST['attacher']=="oui"){ 
        $dernierId = $db->insert_id; 
        if ($result = $db->query("SELECT * FROM `med` WHERE `Email`='$Emailm' AND `Mdp`='$Mdp'")) { 
        if (mysqli_num_rows($result) > 0) { 
         $response["Msg"] = array(); 
        while ($row = mysqli_fetch_array($result)) { 
        $Msg = array(); 
        $Msg["cle"] = intval($row["cle"]); 
        $Msg["heure"] = $row["heure"]; 
        $Msg["date"] = $row["date"]; 
        $Msg["email_m"] = $row["email_m"]; 
        $Msg["email_p"] = $row["email_p"]; 
        $Msg["message"] = $row["message"]; 
        $Msg["type"] = $row["type"]; 
        $Msg["attachement"] = $row["attachement"]; 
        $Msg["attachementNomOrigin"] = $row["attachementNomOrigin"]; 
        array_push($response["Msg"], $Msg); 
        } 

        $response["success"] = 1; 
        $response["message"] = "Succès"; 
        }}} else 

        if($a==true && $_REQUEST['attacher']=="non"){ 
        $response["success"] = 1; 
        $response["message"] = "Succès"; 
        }else{ 

        $response["success"] = 0; 
        $response["message"] = "Erreur lors de l'envoi"; 
        } 

        echo json_encode($response); 
    } else { 
     $response["success"] = 0; 
     $response["message"] = "Email ou Mot de passe incorrect"; 

     echo json_encode($response); 
    } 
}else { 
    $response["success"] = 0; 
    $response["message"] = "Champs manqués"; 

    echo json_encode($response); 
} 
?> 

LogCat:

04-20 18:05:00.149 4509-4509/eddine.charef.mechalikh.swipedemo E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    java.lang.NullPointerException 
      at eddine.charef.mechalikh.swipedemo.message$PostDataAsyncTask.onPostExecute(message.java:231) 
      at eddine.charef.mechalikh.swipedemo.message$PostDataAsyncTask.onPostExecute(message.java:207) 
      at android.os.AsyncTask.finish(AsyncTask.java:631) 
      at android.os.AsyncTask.access$600(AsyncTask.java:177) 
      at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644) 
      at android.os.Handler.dispatchMessage(Handler.java:99) 
      at android.os.Looper.loop(Looper.java:137) 
      at android.app.ActivityThread.main(ActivityThread.java:4813) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:511) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:559) 
      at dalvik.system.NativeStart.main(Native Method) 
04-20 18:05:00.219 4509-6923/eddine.charef.mechalikh.swipedemo I/System.out﹕ {"Msg":[{"cle":271,"heure":"18:01:18","date":"2015-04-20","email_m":"mecha","email_p":"a","message":"hhhh","type":"0","attachement":"12Maps.apk","attachementNomOrigin":"Maps.apk"}],"success":1,"message":"Msg telecharg\u00e9s"} 

В jsonParser я нечетное это

System.out.println(String.valueOf(json); 

и вы может видеть объект json в logca t даже когда исключение выросло ... так что это проблема времени. Как вы думаете?

Edit2 JsonParser.java

public class JSONParser { 

static InputStream is = null; 
static JSONObject jObj = null; 
static String json = ""; 

// constructor 
public JSONParser() { 

} 

// function get json from url 
// by making HTTP POST or GET mehtod 
public JSONObject makeHttpRequest(String url, String method, 
     List<NameValuePair> params) { 

    // Making HTTP request 
    try { 

     // check for request method 
     if(method == "POST"){ 
      // request method is POST 
      // defaultHttpClient 
      DefaultHttpClient httpClient = new DefaultHttpClient(); 
      HttpPost httpPost = new HttpPost(url); 
      httpPost.setEntity(new UrlEncodedFormEntity(params)); 

      HttpResponse httpResponse = httpClient.execute(httpPost); 
      HttpEntity httpEntity = httpResponse.getEntity(); 
      is = httpEntity.getContent(); 

     }else if(method == "GET"){ 
      // request method is GET 
      DefaultHttpClient httpClient = new DefaultHttpClient(); 
      String paramString = URLEncodedUtils.format(params, "utf-8"); 
      url += "?" + paramString; 
      HttpGet httpGet = new HttpGet(url); 

      HttpResponse httpResponse = httpClient.execute(httpGet); 
      HttpEntity httpEntity = httpResponse.getEntity(); 
      is = httpEntity.getContent(); 
     }   


    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } catch (ClientProtocolException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    }catch (Exception e){}; 

    try { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(
       is, "UTF-8"), 8); 
     StringBuilder sb = new StringBuilder(); 
     String line = null; 
     while ((line = reader.readLine()) != null) { 
      sb.append(line + "\n"); 
     } 
     is.close(); 
     json = sb.toString(); 
     System.out.println(json); 
     //HERE IS THE SYSTEM.OUT.PRINT THAT I TALK ABOUT 
     //YOU CAN SEE THE RESULT IN THE LOGCAT 
    } catch (Exception e) { 
     Log.e("Buffer Error", "Error converting result " + e.toString()); 
    } 

    // try parse the string to a JSON object 
    try { 
     jObj = new JSONObject(json); 
    } catch (JSONException e) { 
     Log.e("JSON Parser", "Error parsing data " + e.toString()); 
    } 

    // return JSON String 
    return jObj; 

} 

}

, чтобы дать вам представление о том, что я перед: я хочу, чтобы очистить тха EdittextHere: screenshot после отправки сообщения, поэтому я проверяю тег успеха в postExecute .. если у вас есть другие способы, я буду оценивать это. Заметьте, что это мое первое приложение, поэтому я не знал других способов сделать это

+0

что '' json2' в onPostExecute() '? – Lal

+0

Был ли файл успешно загружен в случае, когда вы получили эту ошибку? Мне кажется, что 'response' является' null', поэтому 'json2' также будет нулевым. Этот вызов, вероятно, возвращает «null» в этом случае: «response = httpclient.execute (httpost); ' –

+0

, когда я обманываю папку прикрепления, я могу открыть или прочитать этот файл .. это означает, что он был успешно загружен, даже если приложение было остановлено, вы правы, я должен был упомянуть об этом –

ответ

0

проблема была в коде PHP .. здесь является правильным

<?php 
date_default_timezone_set ("Africa/Algiers"); 
include('connect.php'); 
$response = array(); 

if (isset($_REQUEST['Emailm'])&& isset($_REQUEST['Mdp'])&&isset($_REQUEST['type']) && isset($_REQUEST['Emailp'])&&isset($_REQUEST['Msg']) ) { 

    $Emailm = $db->real_escape_string($_REQUEST['Emailm']); 
    $Emailp = $db->real_escape_string($_REQUEST['Emailp']); 
    $Mdp = $db->real_escape_string($_REQUEST['Mdp']); 
    $Msg = $_REQUEST['Msg']; 
    $Mdp = $_REQUEST['Mdp']; 
    $Msg= $db->real_escape_string(htmlentities(urldecode($Msg)));  
    $type= $_REQUEST['type']; 
    $target_path1 = "attachement/"; 
    if($type=="0"){ //compte patient 
    if ($result = $db->query("SELECT * FROM `patient` WHERE `Email_p`='$Emailp' AND `Mdp`='$Mdp'")) { 
    $row_cnt = $result->num_rows; 
} 
    }else { //compte médecin 
    if ($result = $db->query("SELECT * FROM `med` WHERE `Email`='$Emailm' AND `Mdp`='$Mdp'")) { 
    $row_cnt = $result->num_rows; 
} 
    } 


    $b=false; 
    $a=false; 

    if ($row_cnt>0) { 
       if($_REQUEST['attacher']=="oui"){  
       $filecount = 0; 
       $files = glob($target_path1 . "*"); 
       if ($files){ 
       $filecount = count($files); 
       } 
       $nomFichier=$filecount.basename($_FILES['attachement']['name']) . ".a"; 
       $target_path1 = $target_path1 . $nomFichier; 
       $nomFichierOrigin=basename($_FILES['attachement']['name']); 
       if(move_uploaded_file($_FILES['attachement']['tmp_name'], $target_path1)) { 
       $b=true; } 
       } 
       else{ 
       $nomFichier=""; 
       $nomFichierOrigin=""; 
       }; 

         $h=new DateTime("now") ; 
         $s=$h->format('G:i:s'); 
         $s2=$h->format('Y-m-d'); 
        if($result = mysqli_query($db,"INSERT INTO `msg`(`cle`, `email_m`, `email_p`, `message`, `attachement`, `type`, `attachementNomOrigin`, `heure`, `date`,`vu`) 
        VALUES ('','$Emailm','$Emailp','$Msg','$nomFichier','$type','$nomFichierOrigin','$s','$s2','non')")) 
        {$a=true;$dernierId = $db->insert_id; 
        } 

        if($a==true && $b==true && $_REQUEST['attacher']=="oui"){ 


        if ($result = $db->query("SELECT * FROM msg WHERE cle='$dernierId'")) { 
        if (mysqli_num_rows($result) > 0) { 
         $response["Msg"] = array(); 
        while ($row = mysqli_fetch_array($result)) { 
        $Msg = array(); 
        $Msg["cle"] = intval($row["cle"]); 
        $Msg["heure"] = $row["heure"]; 
        $Msg["date"] = $row["date"]; 
        $Msg["email_m"] = $row["email_m"]; 
        $Msg["email_p"] = $row["email_p"]; 
        $Msg["message"] = $row["message"]; 
        $Msg["type"] = $row["type"]; 
        $Msg["attachement"] = $row["attachement"]; 
        $Msg["attachementNomOrigin"] = $row["attachementNomOrigin"]; 
        array_push($response["Msg"], $Msg); 
        } 

        $response["success"] = 1; 
        $response["message"] = "Succès"; 
        }}} else 

        if($a==true && $_REQUEST['attacher']=="non"){ 
        $response["success"] = 1; 
        $response["message"] = "Succès"; 
        }else{ 
        $response["success"] = 0; 
        $response["message"] = "Erreur lors de l'envoi"; 
        } 


    } else { 
     $response["success"] = 0; 
     $response["message"] = "Email ou Mot de passe incorrect"; 


    } 
}else { 

    $response["success"] = 0; 
    $response["message"] = "Champs manqués"; 


} echo json_encode($response); 
?>