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 .

  • Android LinearLayout Farbverlauf Hintergrund
  • Wie bekomme ich Klicks auf RecyclerView (NICHT die Kinder)
  • Wie definiere ich "Inflation" in Android
  • Einstellungsaktionstitel und Untertitel
  • Verwenden Sie "onclick" in Eigenschaften im Layout für Dialoge Android
  • Aktivität im Portrait oder Reverse Portrait nur
  • Android: Zeichne Hintergrund ohne GPU OverDraw wie Whatsapp
  • Overlay oder verstecke Symbolleiste bei Kopie / Schnitt Auswahl
  • 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.