Wie man Multipart- / Formulardaten zum Webserver von Android sendet?

Ich habe Probleme mit der Buchung der Formulardaten auf Webserver. Jedes Mal, wenn ich versuche zu posten, bekomme ich diese Antwort vom Server "Keine Nachricht empfangen" so offensichtlich gibt es etwas falsch mit dem Code. Bin ich etwas fehlt?

Hier ist der HTML-Teil, den ich versuche zu posten:

<form id="post" action="url" method="post" enctype="multipart/form-data"> <fieldset> <input id="board" name="board" value="hiekkalaatikko" type="hidden"> <input id="thread" name="thread" value="0" type="hidden"> <input name="uuid" id="uuid" value="1e54a561-b08e-4bad-b9b6-e618ccd91ef5" type="hidden"> <input name="email" style="position: absolute; left: -9999px;" type="text"> <table id="postform"> <tbody> <tr> <td class="label"><label for="postername">Viestinimi</label></td> <td><input name="postername" id="postername" onkeyup="checkName('poster');" type="text"> <span id="posternamestatus"></span></td> </tr> <tr> <td class="label"><label for="functions">Toiminnot</label></td> <td><input name="functions" id="functions" type="text"></td> </tr> <tr> <td class="label"><label for="subject">Aihe</label></td> <td> <input name="subject" id="subject" maxlength="60" type="text"> <input value="Lähetä" name="submit" id="submit" type="submit"> <span id="qrinfo"></span> </td> </tr> <tr> <td class="label"><label for="msg">Viesti</label></td> <td><textarea name="msg" id="msg" rows="4" cols="48"></textarea></td> </tr> <tr> <td class="label"><label for="file">Tiedosto</label></td> <td><input name="file" id="file" size="35" type="file"> <label for="spoilerfile">Juonipaljastus</label> <input id="spoilerfile" name="spoilerfile" type="checkbox"></td> </tr> <tr> <td class="label"><label for="embed">Upote</label></td> <td> <input name="embed" id="embed" type="text"> <select name="embedtype" id="embedtype"> <option value="9">Naamapalmu</option> <option value="1" selected="selected">YouTube</option> <option value="7">LiveLeak</option> <option value="4">SoundCloud</option> <option value="8">Vimeo</option> <option value="5">Vocaroo</option> </select> <a href="http://ylilauta.org/scripts/help.php?embeds" onclick="window.open(this.href,'embedhelp','width=640,height=480,scrollbars=yes'); return false;">Upotusohje</a> </td> </tr> <tr> <td colspan="2"> <ul id="postinfo"> <li>Sallitut tiedostotyypit ovat gif, jpeg, jpg, mp3, png, rar, swf, zip</li> <li>Suurin sallittu tiedostokoko on 10 Mt.</li> <li>2642 käyttäjää paikalla. (<a href="http://ylilauta.org/online.php">Graafi</a>)</li> <li>Yhteensä 10161 viestiä on lähetetty tälle alueelle. (<a href="http://ylilauta.org/postcount.php">Graafi</a>)</li> <li><a href="http://ylilauta.org/hiekkalaatikko/threadlist">Aiheluettelo</a></li> </ul> </td> </tr> </tbody> </table> </fieldset> </form> 

Hier ist android side code:

 @Override public void onClick(View v) { switch(v.getId()){ case R.id.send: MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); try{ reqEntity.addPart("content-type", new StringBody("text/html; charset=UTF-8")); reqEntity.addPart("board", new StringBody("hiekkalaatikko",Charset.forName("UTF-8"))); reqEntity.addPart("thread", new StringBody("0", Charset.forName("UTF-8"))); reqEntity.addPart("anticaptcha", new StringBody(anticaptcha, Charset.forName("UTF-8"))); reqEntity.addPart("uuid", new StringBody(UUID, Charset.forName("UTF-8"))); reqEntity.addPart("email", new StringBody("", Charset.forName("UTF-8"))); reqEntity.addPart("postername", new StringBody(mNameField.getText().toString(), Charset.forName("UTF-8"))); reqEntity.addPart("functions", new StringBody(mActionField.getText().toString(), Charset.forName("UTF-8"))); reqEntity.addPart("subject", new StringBody(mSubjectField.getText().toString(),Charset.forName("UTF-8"))); reqEntity.addPart("submit", new StringBody("Lähetä", Charset.forName("UTF-8"))); reqEntity.addPart("subboard", new StringBody("0", Charset.forName("UTF-8"))); reqEntity.addPart("msg", new StringBody(mMessageField.getText().toString(), Charset.forName("UTF-8"))); reqEntity.addPart("spoilerfile", new StringBody("checked", Charset.forName("UTF-8"))); reqEntity.addPart("embed", new StringBody("9", Charset.forName("UTF-8"))); } catch(Exception e){} postReply reply = new postReply(); reply.execute(reqEntity); break; } } public class postReply extends AsyncTask<MultipartEntity, Void, HttpResponse>{ @Override protected HttpResponse doInBackground(MultipartEntity... arg0) { array = arg0[0]; HttpResponse response = null; try { HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost("url"); httppost.setEntity(arg0[0]); response = httpclient.execute(httppost); 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); } System.out.println(s); } catch (IOException e) { Log.i("Post", "Exception"); e.printStackTrace(); } return response; } 

Bearbeiten: Ich habe versucht, diese Daten an den Server vom Browser und dieser Anwendung zu testen. Ich sehe keine Daten fehlt, aber ich bekomme immer noch die gleiche Antwort "Keine Nachricht empfangen" vom Zielserver.

Dies wird aus dem Browser gesendet:

  Time: Wed, 10 Apr 13 11:33:30 -0700 Source ip: *********** Headers (Some may be inserted by server) UNIQUE_ID = UWWwetBx6hIAAA7wUFQAAAAK HTTP_HOST = posttestserver.com HTTP_USER_AGENT = Mozilla/5.0 (Windows NT 6.1; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0 HTTP_ACCEPT = text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 HTTP_ACCEPT_LANGUAGE = fi-fi,fi;q=0.8,en-us;q=0.5,en;q=0.3 HTTP_ACCEPT_ENCODING = gzip, deflate HTTP_CONNECTION = close CONTENT_TYPE = multipart/form-data; boundary=---------------------------1974624714324 CONTENT_LENGTH = 1326 REMOTE_ADDR = ************** REMOTE_PORT = 11440 GATEWAY_INTERFACE = CGI/1.1 REQUEST_METHOD = POST QUERY_STRING = dir=example REQUEST_URI = /post.php?dir=example REQUEST_TIME = 1365618810 Post Params: key: 'board' value: 'hiekkalaatikko' key: 'thread' value: '0' key: 'uuid' value: '1e54a561-b08e-4bad-b9b6-e618ccd91ef5' key: 'email' value: '' key: 'postername' value: 'name ' key: 'functions' value: 'functions' key: 'subject' value: '' key: 'submit' value: 'Lähetä' key: 'msg' value: 'Test message' key: 'embed' value: '' key: 'embedtype' value: '1' Empty post body. == Multipart File upload. == Received 1 file(s) 0: posted name=file name: type: error: 4 size: 0 File specified was not uploaded. Possible file upload attack. 

Und das ist von meiner Anwendung:

  Time: Wed, 10 Apr 13 11:35:01 -0700 Source ************* Headers (Some may be inserted by server) UNIQUE_ID = UWWw1dBx6hIAAA7bTL8AAAAD HTTP_HTTP_ACCEPT = text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 HTTP_HTTP_ACCEPT_LANGUAGE = fi-fi,fi;q=0.8,en-us;q=0.5,en;q=0.3 CONTENT_LENGTH = 2189 CONTENT_TYPE = multipart/form-data; boundary=---------------------------321842129511553 HTTP_HOST = posttestserver.com HTTP_CONNECTION = close HTTP_USER_AGENT = Mozilla/5.0 (Windows NT 6.1; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0 REMOTE_ADDR = *************** REMOTE_PORT = 11448 GATEWAY_INTERFACE = CGI/1.1 REQUEST_METHOD = POST QUERY_STRING = dir=example REQUEST_URI = /post.php?dir=example REQUEST_TIME = 1365618901 Post Params: key: 'board' value: 'hiekkalaatikko' key: 'thread' value: '0' key: 'uuid' value: '0c44a067-802d-480d-b636-335d6d837c13' key: 'email' value: '' key: 'subject' value: '' key: 'embed' value: '' key: 'embedtype' value: '9' key: 'msg' value: 'Test message' key: 'submit' value: 'Luo aihe' key: 'postername' value: 'Name' key: 'functions' value: 'Functions' key: 'noko' value: 'off' Empty post body. == Multipart File upload. == Received 0 file(s) 

  • Android Studio-Fehler: "Umgebungsvariable zeigt nicht auf eine gültige JVM-Installation"
  • Android "gps erfordert ACCESS_FINE_LOCATION" Fehler, obwohl meine Manifest-Datei enthält diese
  • Android homecreen Verknüpfung Erlaubnis Fehler
  • Capturing executor für aktuelles Thread
  • Wie ändere ich den Dezimaltrennzeichen von DecimalFormat von Komma zu Punkt / Punkt?
  • Android, kann ich AsyncTask in einer separaten Klasse und habe einen Rückruf?
  • Kontakte synchronisieren mit meiner eigenen Anwendung wie Skype oder Whatsapp
  • Werte in Map <K, V> einfügen
  • 4 Solutions collect form web for “Wie man Multipart- / Formulardaten zum Webserver von Android sendet?”

    Sie müssen versuchen, Ihren Wert zu codieren, indem Sie Ihr MultipartEntry mit ändern. Es kann Ihnen auch helfen, Charset.forName("UTF-8") überall zu wiederholen

     MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE, null, Charset.forName(HTTP.UTF_8)); 

    Vergiss auch, dies hinzuzufügen

      httpclient.getParams() .setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1); 

    Fügen Sie diese Zeile vor der Ausführung hinzu, um Ihre Anforderungszeile zu sehen, die Sie an den Server senden

     System.out.println("executing request " + httppost.getRequestLine()); 

    Und das auch für die Antwortzeile vom Server zu sehen

     response.getStatusLine().toString() 

    Füge auch diese Zeile hinzu, um die Verbindung nach httpresponse zu schließen

     httpclient.getConnectionManager().shutdown(); 

    Sie senden ein Sperrfeuer von Entitäten anstatt die UrlEncoded Entität, die der Server erwartet. Versuchen Sie, diesem Muster zu folgen:

      List<NameValuePair> values = new ArrayList<NameValuePair>(); values.add( new BasicNameValuePair( "board", "hiekkalaatikko" ) ); values.add( new BasicNameValuePair( "thread", "0" ) ); ... httppost.setEntity( new UrlEncodedFormEntity( values ) ); 

    Sie werden nicht wirklich mehrteilige Entitäten brauchen, es sei denn, Sie senden Dateien an den Server.

    Verwenden Sie diese Methode ::

      public static String uploadFile2Server(String uploadUrl, String filePath, String serverKeyName) { HttpURLConnection urlConnection = null; DataOutputStream dos = null; DataInputStream inputStream = null; String lineEnd = "rn"; String twoHyphens = "--"; String boundary = "*****"; int bytesRead, bytesAvailable, bufferSize; byte[] buffer; int maxBufferSize = 1 * 1024 * 1024; StringBuilder stringBuilder = null; try { // ------------------ CLIENT REQUEST FileInputStream fileInputStream = new FileInputStream(new File( filePath)); // open a URL connection to the Server URL url = new URL(uploadUrl); // Open a HTTP connection to the URL urlConnection = (HttpURLConnection) url.openConnection(); // Allow Inputs urlConnection.setDoInput(true); // Allow Outputs urlConnection.setDoOutput(true); // Don't use a cached copy. urlConnection.setUseCaches(false); // Use a post method. urlConnection.setRequestMethod("POST"); urlConnection.setRequestProperty("Connection", "Keep-Alive"); urlConnection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary); dos = new DataOutputStream(urlConnection.getOutputStream()); dos.writeBytes(twoHyphens + boundary + lineEnd); dos.writeBytes("Content-Disposition: form-data; name=\"" + serverKeyName + "\";filename=\"" + filePath + " \"" + lineEnd); dos.writeBytes(lineEnd); // create a buffer of maximum size bytesAvailable = fileInputStream.available(); bufferSize = Math.min(bytesAvailable, maxBufferSize); buffer = new byte[bufferSize]; // read file and write it into form... bytesRead = fileInputStream.read(buffer, 0, bufferSize); while (bytesRead > 0) { dos.write(buffer, 0, bufferSize); bytesAvailable = fileInputStream.available(); bufferSize = Math.min(bytesAvailable, maxBufferSize); bytesRead = fileInputStream.read(buffer, 0, bufferSize); } // send multipart form data necesssary after file data... dos.writeBytes(lineEnd); dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); // close streams fileInputStream.close(); dos.flush(); dos.close(); } catch (Exception exception) { exception.printStackTrace(); } // ------------------ read the SERVER RESPONSE try { inputStream = new DataInputStream(urlConnection.getInputStream()); BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(inputStream)); stringBuilder = new StringBuilder(); String line; while ((line = bufferedReader.readLine()) != null) { stringBuilder.append(line); } bufferedReader.close(); inputStream.close(); } catch (Exception exception) { exception.printStackTrace(); } return stringBuilder.toString(); } 

    Vergessen Sie nicht, eine Grenze im Konstruktor Ihres MultipartEntity-Objekts festzulegen, falls Sie eine Serverseite definieren.

     // MultipartEntity(HttpMultipartMode mode, String boundary, Charset charset) MultipartEntity entity = new MultipartEntity(null, "your boundary", null); 

    * Zusätzliche Informationen über Grenzen: http://de.wikipedia.org/wiki/MIME#Multipart_messages

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.