Ich entwickle eine Android-App, die es dem Benutzer ermöglicht, eine Datei auf Dienste wie Twitpic und andere hochzuladen. Der POST-Upload erfolgt ohne externe Bibliotheken und funktioniert problemlos. Mein einziges Problem ist, dass ich keinen Fortschritt erfassen kann, weil das ganze Hochladen erfolgt, wenn ich die Antwort erhalte, während die Bytes in den Ausgabestrom schreibt. Hier ist, was ich tue:Fortschritt beim Hochladen von HTTP POST-Dateien nicht möglich (Android)
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setRequestMethod("POST");
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
Dann schreibe ich die Formulardaten an dos, die hier nicht so wichtig ist, jetzt. Danach schreibe ich die Dateidaten selbst (das Lesen von „in“, die die Input der Daten ich senden wollen):
while ((bytesAvailable = in.available()) > 0)
{
bufferSize = Math.min(bytesAvailable, maxBufferSize);
byte[] buffer = new byte[bufferSize];
bytesRead = in.read(buffer, 0, bufferSize);
dos.write(buffer, 0, bytesRead);
}
Danach habe ich die mehrteilige Formulardaten, um das Ende des Sende Datei. Dann schließe ich die Ströme:
in.close();
dos.flush();
dos.close();
Das alles funktioniert völlig in Ordnung, kein Problem so weit. Mein Problem ist jedoch, dass der gesamte Prozess bis zu diesem Punkt ungefähr eine oder zwei Sekunden dauert, egal wie groß die Datei ist. Der Upload selbst scheint zu passieren, wenn ich die Antwort lauten:
DataInputStream inStream = new DataInputStream(conn.getInputStream());
Dies dauert einige Sekunden oder Minuten, je nachdem, wie groß die Datei ist und wie schnell die Internetverbindung. Meine Fragen sind jetzt: 1) Warum passiert der Uplaod nicht, wenn ich die Bytes nach "dos" schreibe? 2) Wie kann ich einen Fortschritt erfassen, um während des Uploads einen Fortschrittsdialog zu zeigen, wenn alles auf einmal passiert?
/EDIT: 1) ich den Content-Length im Header, die das Problem etwas ändern gesetzt, aber nicht in irgendeine Weise lösen: Jetzt wird der gesamte Inhalt nach dem letzten Byte hochgeladen in geschrieben der Strom. Das ändert nichts an der Situation, dass Sie den Fortschritt nicht erfassen können, da die Daten auf einmal geschrieben werden. 2) Ich versuchte MultipartEntity in Apache HttpClient v4. Dort haben Sie überhaupt keinen OutputStream, weil alle Daten geschrieben werden, wenn Sie die Anfrage ausführen. Es gibt also keine Möglichkeit, einen Fortschritt zu machen.
Gibt es jemanden da draußen, der eine andere Idee hat, wie man einen Prozess in einem mehrteiligen/Formular-Upload erhält?
Vielleicht diese Antwort werden Sie einige Hinweise geben: http://stackoverflow.com/questions/254719/file-upload-with-java-with-progress-bar/470047#470047 – pableu
@pableu : Ich habe das untersucht. Das Problem ist: Es gibt keine RequestEntity im Android SDK. Es ist Teil von Apache HttpClient 3.1, der von Android nicht mehr verwendet wird. Jetzt habe ich sogar versucht, die neuen 4.0.1-Bibliotheken zu laden, aber ich sehe keine Möglichkeit, hier einen Fortschritt zu machen. Noch mehr Ideen? – Manuel