Upload progress bar in android?
Ich verwende den folgenden code, um das Video hochzuladen, um php-server, es war in Ordnung arbeiten, aber ich brauche, um den Fortschritt zu zeigen-bar, während die Datei hochgeladen wird, muss ich aus der Synchronisation von Datei-upload und die Fortschrittsleiste erhöhen.Jemand deuten einige Idee?
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)
Dank .
Überprüfen Sie die folgende Antwort, vielleicht hilft es: [stackoverflow.com/questions/15572747/... [1]: stackoverflow.com/a/19295719/463846
Wie können Sie zusätzliche Daten, wie ein string, mit dieser multipart-Daten?
Wie können Sie zusätzliche Daten, wie ein string, mit dieser multipart-Daten?
InformationsquelleAutor Karthi | 2011-02-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Stellen Sie Ihre upload-code in der
doInBackGround
Methode einesAsyncTask
. Sie können dannpublishProgress
gibt es ab und an inonProgressUpdate
update der ProgressBar.Haben eine schauen Sie hier auf, wie dies Aussehen kann mit
publishProgress
.InformationsquelleAutor Heiko Rupp
Ich denke, Sie werden Fragen, wie kann man eine numerische Darstellung der aktuellen upload-Fortschritt, so dass Sie können zeigen, dass Wert als ein progress-bar. Mit Ihrem aktuellen code, ich bin mir nicht sicher,, dass Sie einfach kann. Was ist die größte Datei, die Sie versucht haben hochzuladen? Ich denke, Sie erhalten eine
OutOfMemory
Fehler mit großen Dateien. Sie tun dies:Ihre "Puffer" ist nur ein array, dass die gleiche Größe wie Ihre gesamte Datei. Der Aufruf
fileInputStream.read()
könnte versuchen, um den vollständigen Inhalt der Datei in den "Puffer". Wenn Ihre Datei sehr groß ist (mehr als ein paar Dutzend Megabyte), dann kann die app zum Absturz mit einemOutOfMemory
Fehler.Wenn Sie einen kleinen Puffer mit einer festen Größe, dann jedes mal durch die
while
Schleife können Sie berechnen die Menge der Daten, die Sie bereits gesendet haben, konvertieren Sie diese zu einem Prozentsatz-Wert und entweder callpublishProgess
für eineAsyncTask
odersendMessage
für eineHandler
.Aber dieser Fortschritt ist nicht der Fortschritt der Datei, die hochgeladen wird. Seine den Fortschritt der Datei wird in den buffer geschrieben. Richtig ?
es kommt auf die Reihenfolge der Aufrufe in der Schleife. Wenn Sie schreiben, um den Ausgabe-stream, dann berechnen und veröffentlichen Sie die Fortschritte, dann ist es die Menge der hochgeladenen Daten. Wenn Sie die Reihenfolge tauschen dann ist es die Menge der Daten, die gelesen worden ist. In der Praxis, der Puffer ist in der Regel viel kleiner als die Menge der Daten, die hochgeladen werden, so wäre es für den Nutzer keinen Unterschied.
InformationsquelleAutor dave.c
Oder Sie können einen Thread mit einer Handler-wenn Sie möchten feinere Kontrolle, obwohl für die meisten Aufgaben AFAIK AsyncTask funktionieren sollte.
InformationsquelleAutor SidJ
Tat den trick für mich !
bitte fügen Sie requestlength Beschreibung auch.
requestLength = sourceFile.Länge();
InformationsquelleAutor Muhammad Riyaz