2013-10-09 9 views
6

Scenario: Sto tentando di inviare alcuni dati POST tramite HttpURLConnection in un servizio (con aggiornamenti di avanzamento). Sto acquisendo un'immagine dalla galleria e poi inviandola a un server php con 2 parametri; invnum e password.Caricamento parametri e immagine tramite HttpURLConnection su un server PHP (Android)

Nota: Se lo sto facendo con il metodo HttpClient, i parametri e l'immagine vengono inviati e ricevuti nel server, ma non in grado di monitorare lo stato di avanzamento del caricamento. Ho visto alcuni codici relativi all'entità multipart personalizzata, per quanto possibile vorrei evitare di fare riferimento a una libreria

Ho esaminato molte domande correlate in SO ma non riesco a trovare una soluzione. Di seguito sono riportati i codici correnti che ho nel mio servizio.

protected void onHandleIntent(Intent intent) { 
    String invnum = intent.getStringExtra("invnum"); 
    String uploadURL = intent.getStringExtra("uploadURL"); 
    String imageURI = intent.getStringExtra("imageURI"); 
    uri = Uri.parse(imageURI); 

    String pass = "password"; 

    //get the actual path of the image residing in the phone 
    String[] filePathColumn = { MediaStore.Images.Media.DATA }; 
    Cursor cursor = getContentResolver().query(uri,filePathColumn, null, null, null); 
    cursor.moveToFirst(); 
    int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
    picturePath = cursor.getString(columnIndex); 
    cursor.close(); 

    ResultReceiver receiver = (ResultReceiver) intent.getParcelableExtra("receiver"); 

    //check url 
    try { 
     File file = new File(picturePath); 
     FileInputStream fileInputStream = new FileInputStream(file); 
     byte[] bytes = new byte[(int) file.length()]; 
     fileInputStream.read(bytes); 
     fileInputStream.close(); 

     String fileName = file.getName(); 

     URL url = new URL(uploadURL); 
     HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
     connection.setDoInput(true); 
     connection.setDoOutput(true); 
     connection.setUseCaches(false); 
     connection.setConnectTimeout(30000); 
     connection.setReadTimeout(30000); 
     connection.setChunkedStreamingMode(1024); 
     connection.setRequestMethod("POST"); 
     connection.setRequestProperty("Connection", "Keep-Alive"); 
     connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10 (.NET CLR 3.5.30729)"); 
     connection.setRequestProperty("image", fileName); 
     connection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary); 

     DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream()); 

     //send multipart form data (required) for file 
     outputStream.writeBytes("Content-Disposition: form-data; name=\"image\";filename=\"" + fileName + "\"" + lineEnd); 
     outputStream.writeBytes("Content-Type: image/jpeg" + lineEnd); 
     //outputStream.writeBytes("Content-Type: " + URLConnection.guessContentTypeFromName(fileName) + lineEnd); 
     //outputStream.writeBytes("Content-Transfer-Encoding: binary" + lineEnd); 
     //outputStream.writeBytes("Content-Type: application/octet-stream" + lineEnd); 
     outputStream.writeBytes("Content-Length: " + file.length() + lineEnd); 
     outputStream.writeBytes(lineEnd); 

     int bufferLength = 1024; 
     for (int i = 0; i < bytes.length; i += bufferLength) { 
      // publishing the progress.... 
      Bundle resultData = new Bundle(); 
      resultData.putInt("progress" ,(int)((i/(float) bytes.length) * 100)); 
      receiver.send(UPDATE_PROGRESS, resultData); 

      if (bytes.length - i >= bufferLength) { 
       outputStream.write(bytes, i, bufferLength); 
      } else { 
       outputStream.write(bytes, i, bytes.length - i); 
      } 
     } 

     //end output 
     outputStream.writeBytes(lineEnd); 

     //write more parameters other than the file 
     outputStream.writeBytes(twoHyphens + boundary + lineEnd); 
     //outputStream.writeBytes(twoHyphens + boundary + lineEnd); //less twohyphens 
     outputStream.writeBytes("Content-Disposition: form-data; name=\"invnum\"" + lineEnd); 
     //outputStream.writeBytes("Content-Type: text/plain; charset=UTF-8" + lineEnd); 
     //outputStream.writeBytes("Content-Length: " + invnum.length() + lineEnd); 
     outputStream.writeBytes(lineEnd); 
     outputStream.writeBytes(invnum + lineEnd); 
     outputStream.writeBytes(twoHyphens + boundary + lineEnd); 

     outputStream.writeBytes("Content-Disposition: form-data; name=\"pass\"" + lineEnd); 
     //outputStream.writeBytes("Content-Type: text/plain; charset=UTF-8" + lineEnd); 
     //outputStream.writeBytes("Content-Length: " + pass.length() + lineEnd); 
     outputStream.writeBytes(lineEnd); 
     outputStream.writeBytes(pass + lineEnd); 
     outputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); 

     // publishing the progress.... 
     Bundle resultData = new Bundle(); 
     resultData.putInt("progress", 100); 
     receiver.send(UPDATE_PROGRESS, resultData); 

     outputStream.flush(); 
     outputStream.close(); 
     //input ignored for now 

    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

Quando si esegue l'applicazione, i progressi si riflette bene, ma al momento del check sul mio server, nessun file vengono caricati a tutti. In realtà nessun dato viene inviato o ricevuto dal server. Qualcuno ha idea di cosa potrebbe causare questo problema? Di seguito è riportato il mio codice server.

$pass = $_POST['pass']; 
$invnum = $_POST['invnum']; 
$image = $_POST['image']; 
if ($pass == 'password') { 
    //do something 
} 

Aggiornamenti: Tanto per cominciare, sto ottenendo un errore 404 dal HttpURLConnection. Il mio url ha l'aspetto di "http://www.xyz.com/upload.php". Aggiornamento alla precedente frase, rimuovendo "setChunkedStreamingMode", sono in grado di caricare correttamente i parametri sul server ma non sull'immagine! Sono vicino!

+0

http://stackoverflow.com/a/23648537/1318946 –

risposta

0

In metodo HttpClient Android migliore di HttpUrlConnection. Ho solo mostrare come metodo exceute post con HttpClient. Ho usato questo samly structer;

HttpClient client = new DefaultHttpClient(); 
HttpPost post = new HttpPost(); 
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(<n>);// you have pass, invnum and image 
nameValuePairs.add(new BasicNameValuePair("image", "<filName>")); 
post.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
client.execute(post); 
+1

Questo metodo funziona ma non è quello che sto cercando, non riesco a tenere traccia dell'avanzamento del caricamento utilizzando HttpClient. – dionkta

+0

Forse controllerai http://stackoverflow.com/questions/7057342/how-to-get-a-progress-bar-for-a-file-upload-with-apache-httpclient-4 – nurisezgin

+1

Ti sbagli su Android i metodi httpclient sono migliori. In generale httpurlconnection è stato migliorato di più per le versioni più recenti di Android. Maggiori informazioni qui: http://android-developers.blogspot.de/2011/09/androids-http-clients.html – Warpzit

7

finalmente riusciti a farlo funzionare ...

La linea "connection.setChunkedStreamingMode (1024);" sta causando il problema. Dopo aver rimosso ciò, il caricamento dei parametri e del file è riuscito. Rimane un problema minore, l'avanzamento del caricamento non è accurato. Il progresso restituito è in realtà il buffer che viene riempito, che è quasi istantaneo anche per un'immagine da 3 MB. Il file viene ancora caricato in background dopo che il progresso raggiunge i 100. Indovina che sarà un'altra domanda per un'altra volta.

+1

Hai mai capito come risolvere questo problema? Sto provando a fare la stessa cosa, ma tutti sembrano pensare che stiano monitorando il progresso del caricamento quando in realtà stanno semplicemente tracciando la scrittura sul burro (come hai detto tu). – Brian

+0

grazie mille amico .. sono stato irritato da questo problema da una settimana. finalmente fatto con la tua risposta ... davvero grazie mille ... – ELITE

Problemi correlati