1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Text File Upload per HTTP Post

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von GMoN, 20.04.2012.

  1. GMoN, 20.04.2012 #1
    GMoN

    GMoN Threadstarter Android-Lexikon

    Beiträge:
    1,137
    Erhaltene Danke:
    131
    Registriert seit:
    01.02.2009
    Ich habe ein Problem, bei dem ich jetzt nicht mehr weiter komme. Und zwar möchte ich in meiner App einen Text Datei Upload auf einen Web Server anbieten.

    Die .php erzeugt fplgendes HTML Form:
    Code:
    <html>
    <body>
    <form enctype="multipart/form-data" action="#" method="post">
    	<input type="file" name="uploadfile" size="84" /><br />
    	Username: <input name="username" type="text" size="30" maxlength="30" value="" /><br />
    	Password: <input name="password" type="password" size="20" maxlength="20" /><br />
    	<input type="checkbox" name="test" value="test" />Testen (Nicht in die Datenbank)<br />
    	<input type="submit" value="Upload" />
    </form>
    </body>
    </html>
    Jetzt habe ich viel gesucht im Web und habe folgenden asynchronen Task gebastelt:
    Code:
    private void upload() {
     new AsyncTask<String,Void, int[]>(){
      int[] alt;
      @Override
       protected int[] doInBackground(String... urlStr){
        StringBuffer htmlCode = new StringBuffer();
        File file = new File(Environment.getExternalStorageDirectory() + "/test/" + "test.txt");
        try{
         alt=null;
         HttpClient httpclient = new DefaultHttpClient();
         HttpPost httppost = new HttpPost("https://www.test.com/upload.php");
         try {
          List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(4);
          nameValuePairs.add(new BasicNameValuePair("file", file));
          nameValuePairs.add(new BasicNameValuePair("username", "testbunny"));
          nameValuePairs.add(new BasicNameValuePair("password", "12345"));
          nameValuePairs.add(new BasicNameValuePair("test", "test"));
          httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
          HttpResponse response =httpclient.execute(httppost);
          Log.d(TAG, inputStreamToString(response.getEntity().getContent()).toString());
          } catch (ClientProtocolException e) {
    	    			         // TODO Auto-generated catch block
          } catch (IOException e) {
    	    			         // TODO Auto-generated catch block
          }
    	    
          } catch (Exception e) {
           e.printStackTrace();
          }
         return alt;
        }         
       @Override
        protected void onPostExecute(int[] alt){
       }
      }.execute("http://www.google.com");
    	    			
    Damit kann ich den Server ansprechen und er reagiert auf das Passwort und den Usernamen und gibt entsprechende Rückmeldung. Leider wird keine Datei hochgeladen. Auch diese Test Checkbox wird scheinbar nicht übertragen. Wie macht man das richtig?
     
  2. miha, 20.04.2012 #2
    miha

    miha Fortgeschrittenes Mitglied

    Beiträge:
    294
    Erhaltene Danke:
    43
    Registriert seit:
    12.01.2010
    Ich verstehe nicht was das für ein php file mit html form oben sein soll? Oder ist das dasselbe in html was deine app auch machen soll?
    Ohne den Javacode jetzt angeguckt zu haben würde ich gerne dein Empfangsphp upload.php sehen zu dem du postest.
    Vielleicht verstehe ich auch nur falsch ...

    Und dieses Basicnamevaluepair mit file wird wohl keine datei hochladen sondern nur file.toString oder?

    Gesendet von meinem SK17i mit der Android-Hilfe.de App
     
    Zuletzt bearbeitet: 20.04.2012
  3. GMoN, 20.04.2012 #3
    GMoN

    GMoN Threadstarter Android-Lexikon

    Beiträge:
    1,137
    Erhaltene Danke:
    131
    Registriert seit:
    01.02.2009
    Ja, diese upload.php auf dem Server, der nicht mir gehört, erzeugt dieses html Formular, in welchem man Username und passwort eingeben kann, sowie eine Datei auswählen und hochladen kann. Und man kann mit deser Checkbox auswählen, ob das nur ein Test sein soll oder ob die Datei wirklich aus dem Server gespeichert werden soll.

    Die Eingaben und das Text File soll aus meiner App hochgeladen werden.
     
  4. miha, 20.04.2012 #4
    miha

    miha Fortgeschrittenes Mitglied

    Beiträge:
    294
    Erhaltene Danke:
    43
    Registriert seit:
    12.01.2010
    Ich würde es erstmal mit einem eigenen Server machen bis das geht mit eigenem Empfangsphp für die Daten.
    Das Problem wird aber der Dateipost sein den du nicht machst. Du lädst einfach nur ein paar Strings hoch und kein multipart mit dem Dateiinhalt.

    Gesendet von meinem SK17i mit der Android-Hilfe.de App
     
  5. GMoN, 21.04.2012 #5
    GMoN

    GMoN Threadstarter Android-Lexikon

    Beiträge:
    1,137
    Erhaltene Danke:
    131
    Registriert seit:
    01.02.2009
    Ich habe leider keinerlei Ahnung von php Servern Multipart usw.

    Multipart geht wohl nicht mit Android SDK Mitteln, also habe ich apache Libaries importiert

    Code:
    import org.apache.http.entity.mime.HttpMultipartMode;
    import org.apache.http.entity.mime.MultipartEntity;
    import org.apache.http.entity.mime.content.FileBody;
    import org.apache.http.entity.mime.content.StringBody;
    Und die Upload function und so abgeändert.

    Code:
    private void upload2(){
    			  final ProgressDialog dialog2 = new ProgressDialog(gmon.this);
    
    		        
    		        
    			new AsyncTask<Void, Void, Boolean>() {
    				protected void onPreExecute() {
    		            dialog2.setMessage("Uploading file");
    		            dialog2.setCancelable(false);
    		            dialog2.show();
    				}
    
    		        @Override
    		        protected Boolean doInBackground(Void... arg0) {
    		        	 Log.v(TAG, "hier");
    		            try {
    		                HttpClient httpClient = new DefaultHttpClient();
    		                HttpPost postRequest = new HttpPost("http://www.server.com/upload.php");
    		                MultipartEntity reqEntity = new MultipartEntity(
    		                        HttpMultipartMode.BROWSER_COMPATIBLE);
    
    		                reqEntity.addPart("username", new StringBody("testbunny"));
    		                try {
    		                    File f = new File(Environment.getExternalStorageDirectory(), "/gmon/gmon_wlan.txt");
    
    		                    FileBody body = new FileBody(f);
    		                    reqEntity.addPart("uploadfile", body);
    
    		                } catch (Exception e) {
    		                    reqEntity.addPart("uploadfile", new StringBody(""));
    		                }
    
    		                reqEntity.addPart("password", new StringBody("12345"));
    
    		                postRequest.setEntity(reqEntity);
    		                HttpResponse response = httpClient.execute(postRequest);
    
    		                BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8")); 
    		                String sResponse; StringBuilder s = new StringBuilder(); 
    		                while ((sResponse = reader.readLine()) != null) { 
    		                    s = s.append(sResponse); 
    		                } 
    		                Log.v("Response for POst", s.toString());
    		                return true;
    		            } catch (Exception e) {
    		                Log.e("f", "Error :: " + e);
    		            }
    		            return false;
    		        }
    
    		        @Override
    		        protected void onPostExecute(Boolean result) {
    		            if (dialog2.isShowing()) {
    		                dialog2.dismiss();
    		            }
    		            if (result) {
    		                Toast.makeText(gmon.this,
    		                        "File uploaded successfully", Toast.LENGTH_LONG)
    		                        .show();
    
    		            } else {
    		                Toast.makeText(gmon.this, "Your Request not complete",
    		                        Toast.LENGTH_LONG).show();
    		            }
    		        }
    		    }.execute();
    		 }
    Die Datei wird zwar vom Handy ins Internet hochgeladen aber auf dem Server kommt sie nicht an. Der Progress dialog läuft ne weile bei einem 2.5 MB file aber als Response bekomme ich nur die HTML Form aus der php von oben. Der Server reagiert hier scheinbar nicht mal auf user und password. Eine exception tritt aber auch nicht auf.
     

Diese Seite empfehlen