¿Cómo enviar datos multipart / form a un servidor web desde android?

Tengo problemas para publicar los datos del formulario en el servidor web. Cada vez que intento publicar tengo esta respuesta del servidor "No hay mensaje recibido" por lo que obviamente hay algo mal con el código. ¿Me estoy perdiendo de algo?

Esta es la parte HTML que intento publicar:

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

Aquí está el código lateral de Android:

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

Edit: Traté de enviar estos datos al servidor de prueba desde el navegador y esta aplicación. No veo ningún dato que falta, pero consigo todavía esta misma respuesta "ningún mensaje recibido" del servidor de la blanco.

Esto se envía desde el navegador:

  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. 

Y esto es de mi aplicación:

  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) 

Debe intentar codificar su valor cambiando su MultipartEntry con. También puede ayudarle a repetir Charset.forName("UTF-8") todas partes

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

No se olvide también de añadir esto

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

Agregue esta línea antes de ejecutar para ver su línea de solicitud que está enviando al servidor

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

Y esto también para ver la línea de respuesta del servidor

 response.getStatusLine().toString() 

Agregue también esta línea para cerrar la conexión después de httpresponse

 httpclient.getConnectionManager().shutdown(); 

Está enviando un aluvión de entidades en lugar de la entidad UrlEncoded que el servidor espera. Intente seguir este patrón:

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

Realmente no necesitará entidades de varias partes a menos que esté enviando archivos al servidor.

Utilice este método:

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

No olvide establecer un límite en el constructor de su objeto MultipartEntity en caso de que defina un lado del servidor.

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

* Información adicional sobre los límites: http://en.wikipedia.org/wiki/MIME#Multipart_messages

  • Endpoints de Google App Engine Cloud userId es nulo
  • MediaRecorder start () falla si se llama demasiado rápido
  • Android: centra el título de la barra de herramientas
  • AES128 Descifrado: javax.crypto.badpaddingexception pad block dañado
  • ¿Cómo usar SQLiteOpenHelper sin el uso menos restrictivo de Contexto?
  • Generic OR en lugar de AND <T extends Number | CharSequence>
  • Android Wear evita el sueño
  • ¿Cómo puedo crear un widget de aplicación de paginación de Android compatible con versiones anteriores?
  • Fragmento de Android objeto nulo mNextAnim Crach interno
  • Analytic dispatcher y gestión de configuración para uso personalizado
  • AutoCompleteTextView fondo / color de primer plano
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.