Как отправить данные multipart / form на веб-сервер из Android?

У меня возникли проблемы с отправкой данных формы на веб-сервер. Каждый раз, когда я пытаюсь отправить сообщение, я получаю этот ответ с сервера «Нет сообщения», поэтому, очевидно, что-то не так с кодом. Я что-то упускаю?

Вот часть HTML, которую я пытаюсь опубликовать:

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

Вот андроидный код:

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

Изменить: я попытался отправить эти данные для проверки сервера из браузера и этого приложения. Я не вижу никаких данных, но я получаю этот же ответ «Сообщение не получено» с целевого сервера.

Это отправляется из браузера:

  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. 

И это из моего заявления:

  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) 

Solutions Collecting From Web of "Как отправить данные multipart / form на веб-сервер из Android?"

Вы должны попытаться закодировать свое значение, изменив свой MultipartEntry. Это также может помочь вам повторить Charset.forName("UTF-8") везде

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

Не забудьте также добавить это

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

Добавьте эту строку перед выполнением, чтобы увидеть строку запроса, которую вы отправляете на сервер.

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

И это также для того, чтобы увидеть ответную строку с сервера

 response.getStatusLine().toString() 

Добавьте также эту строку, чтобы закрыть соединение после httpresponse

 httpclient.getConnectionManager().shutdown(); 

Вы отправляете заграждение объектов, а не UrlEncoded сервером. Попробуйте следовать этому шаблону:

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

Вам не понадобятся многокомпонентные объекты, если вы не отправляете файлы на сервер.

Используйте этот метод ::

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

Не забудьте установить границу в конструкторе вашего объекта MultipartEntity, если вы определяете одну сторону сервера.

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

* Дополнительная информация о границах: http://en.wikipedia.org/wiki/MIME#Multipart_messages