2013-04-01 10 views
7

Ho un problema con la pubblicazione dei dati del modulo al server web. Ogni volta che provo a post ricevo questa risposta dal server "Nessun messaggio ricevuto", quindi ovviamente c'è qualcosa di sbagliato nel codice. Mi sto perdendo qualcosa?come inviare i dati multipart/form al server web da Android?

Qui è la parte HTML che sto provando a scrivere:

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

Ecco codice lato 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: Ho provato a inviare questi dati al server di prova dal browser e questa applicazione. Non vedo alcun dato mancante, ma ottengo sempre la stessa risposta "Nessun messaggio ricevuto" dal server di destinazione.

Si tratta di inviare dal browser:

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. 

E questo da mia domanda:

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) 
+0

sei sicuro, oltre arg0 [0] in linea httppost.setEntity (arg0 [0]) è proprio la cosa? – jimpanzer

risposta

2

Si deve cercare di codificare il valore cambiando la tua MultipartEntry con. Può anche aiutare a ripetere Charset.forName("UTF-8") ovunque

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

Non dimenticate inoltre di aggiungere questo

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

Aggiungere questa riga prima di eseguire per vedere la vostra linea di richiesta che si sta inviando al server

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

e questo anche per vedere la linea di risposta dal server

response.getStatusLine().toString() 

aggiungere anche questa linea per chiudere la connessione dopo HttpResponse

httpclient.getConnectionManager().shutdown(); 
+0

Nessuna modifica, I/System.out (18795): richiesta di esecuzione POST http://ylilauta.org/post Risposta HTTP/1.1: I/System.out (18795): 200 Grazie comunque – user1888162

+0

@ user1888162 ottieni ancora questo errore?"Nessun messaggio ricevuto" si prega di postare l'uscita logcat completa –

+0

@ user1888162 aggiungere anche questa riga per chiudere la connessione dopo httpresponse: httpclient.getConnectionManager(). Shutdown(); –

4

si sta inviando un fuoco di fila di entità piuttosto che il UrlEncoded entità server si aspetta. Prova a seguire questo schema:

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

Non avrai davvero bisogno di entità multiparte se non invii file al server.

+0

Sto anche caricando i file in modo che siano necessarie entità multiparte – user1888162

0

Non dimenticare di impostare un limite nel costruttore del tuo oggetto MultipartEntity nel caso in cui si stia definendo un lato server.

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

* informazioni extra sui confini: http://en.wikipedia.org/wiki/MIME#Multipart_messages

+0

Nessun cambiamento ma grazie comunque. Ho aggiunto i risultati post alla mia domanda – user1888162

1

Utilizzare questo metodo ::

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

Si prega di aggiungere una descrizione a cosa sta facendo esattamente il codice. – Cheesebaron

Problemi correlati