Upload Fortschrittsbalken in Android?

Ich benutze den folgenden Code, um das Video auf PHP-Server hochladen, es funktionierte gut, aber ich muss die Fortschrittsanzeige während der Datei hochgeladen werden, ich muss die Synchronisation zwischen Datei-Upload und Fortschrittsbalken erhöhen.

HttpURLConnection conn = null; DataOutputStream dos = null; DataInputStream inStream = null; String lineEnd = "\r\n"; String twoHyphens = "--"; String boundary = "*****"; int bytesRead, bytesAvailable, bufferSize; byte[] buffer; int maxBufferSize = 1 * 1024 * 1024; String responseFromServer = ""; File sourceFile = new File(sourceFileUri); if (!sourceFile.isFile()) { Log.e("Huzza", "Source File Does not exist"); return; } int serverResponseCode=0; try { // open a URL connection to the Servlet FileInputStream fileInputStream = new FileInputStream(sourceFile); URL url = new URL(upLoadServerUri); conn = (HttpURLConnection) url.openConnection(); // Open a HTTP connection to the URL conn.setDoInput(true); // Allow Inputs conn.setDoOutput(true); // Allow Outputs conn.setUseCaches(false); // Don't use a Cached Copy conn.setRequestMethod("POST"); conn.setRequestProperty("Connection", "Keep-Alive"); conn.setRequestProperty("ENCTYPE", "multipart/form-data"); conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary); conn.setRequestProperty("uploadedfile", fileName); // conn.setFixedLengthStreamingMode(1024); //conn.setChunkedStreamingMode(1); dos = new DataOutputStream(conn.getOutputStream()); dos.writeBytes(twoHyphens + boundary + lineEnd); dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\""+ fileName + "\"" + lineEnd); dos.writeBytes(lineEnd); bytesAvailable = fileInputStream.available(); // create a buffer of maximum size Log.i("Huzza", "Initial .available : " + bytesAvailable); //bufferSize = Math.min(bytesAvailable, maxBufferSize); bufferSize=(int)sourceFile.length(); System.out.println("BytesAvail"+bytesAvailable); System.out.println("maxBufferSize"+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); // Responses from the server (code and message) serverResponseCode = conn.getResponseCode(); String serverResponseMessage = conn.getResponseMessage(); Log.i("Upload file to server", "HTTP Response is : " + serverResponseMessage + ": " + serverResponseCode); // close streams Log.i("Upload file to server", fileName + " File is written"); fileInputStream.close(); dos.flush(); dos.close(); } catch (MalformedURLException ex) { ex.printStackTrace(); Log.e("Upload file to server", "error: " + ex.getMessage(), ex); } catch (Exception e) { e.printStackTrace(); } //this block will give the response of upload link try { BufferedReader rd = new BufferedReader(new InputStreamReader(conn .getInputStream())); String line; while ((line = rd.readLine()) != null) { Log.i("Huzza", "RES Message: " + line); } rd.close(); } catch (IOException ioex) { Log.e("Huzza", "error: " + ioex.getMessage(), ioex); } return; // like 200 (Ok) 

Vielen Dank .

  • Starten Sie den Dienst von der Benachrichtigung
  • Android Studio zeigt Quellen von API von compileSdkVersion beim Debuggen auf Gerät mit älterer API
  • Kamera funktioniert nicht bei der Verwendung von Cache Uri als MediaStore.EXTRA_OUTPUT
  • Unterschiedliche Schriftgröße von Strings in derselben Textansicht
  • Cordova Manifest Fusion gescheitert
  • TextView in ViewPager fängt Berührungsereignisse ab
  • ScrollView programmgesteuert deaktivieren?
  • Exception aktivieren C ++
  • Ein Raster-Layout von Symbol- / Text-Schaltflächen
  • Verwenden Sie Support-Bibliothek in Android-Projekten und Bibliothek (Android Studio)
  • Falsches Fragment in ViewPager empfängt onContextItemSelected call
  • Android: Wie kann man innerhalb der Spalte von TableLayout zentrieren?
  • 4 Solutions collect form web for “Upload Fortschrittsbalken in Android?”

    Setzen Sie Ihren Upload-Code in die doInBackGround Methode einer AsyncTask . Du kannst dann von dort aus veröffentlichen und in onProgressUpdate die ProgressBar aktualisieren.

    Schauen Sie hier, wie das mit publishProgress aussehen publishProgress .

    Ich glaube, Sie fragen, wie Sie eine numerische Darstellung des aktuellen Upload-Fortschritts erhalten können, damit Sie diesen Wert als Fortschrittsbalken anzeigen können. Mit deinem aktuellen Code bin ich nicht sicher, dass du es leicht kann. Was ist die größte Datei, die Sie zum Hochladen versucht haben? Ich denke, du bekommst einen OutOfMemory Fehler mit großen Dateien. Du machst das:

     byte[] buffer; bufferSize=(int)sourceFile.length(); buffer = new byte[bufferSize]; bytesRead = fileInputStream.read(buffer, 0, bufferSize); while (bytesRead > 0) { ... 

    Dein "Puffer" ist nur ein Array, das die gleiche Größe hat wie deine ganze Datei. Der Aufruf von fileInputStream.read() könnte versuchen, den vollständigen Inhalt der Datei in den "Puffer" zu stellen. Wenn deine Datei groß ist (mehr als ein paar Dutzend Megabyte), dann kann deine App mit einem OutOfMemory Fehler OutOfMemory .

    Wenn du einen kleinen Puffer mit einer festen Größe verwende, dann kannst du jedes Mal durch die while Schleife die Datenmenge berechnen, die du bereits gesendet hast, diese in einen prozentualen Wert umwandeln und entweder publishProgess für eine AsyncTask oder sendMessage für einen Handler sendMessage .

    Oder Sie können einen Thread mit einem Handler verwenden, wenn Sie feinere körnige Kontrolle wünschen, aber für die meisten Aufgaben AFAIK AsyncTask sollte funktionieren.

     connection.setFixedLengthStreamingMode((int) requestLength); 

    Hat den Trick für mich!

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