multipart/form POST Upload mit Fortschrittsanzeige unmöglich?

  • Antworten:0
Manuel Nauert
  • Forum-Beiträge: 27

12.07.2010, 18:46:26 via Website

Ich bin auf ein Problem gestoßen, für das es so ohne weiteres wohl keine Lösung gibt. Jedenfalls habe ich auch nach mehreren Tagen suchen in verschiedensten Foren nichts gefunden:

Es soll aus einer App heraus ein multipart/form POST Upload gemacht werden. Hierfür habe ich zwei Möglichkeiten gefunden:
1) Mit HttpURLConnection
Man baut über URL.openConnection(); eine HttpURLConnection auf, setzt die erforderlichen Parameter, erhält mit HttpURLConnection.getOutputStream() den Stream, in den man die Multipart-Daten schreiben will und durchläuft für die hochzuladene Datei eine Schleife, in der die Daten der Datei abgegriffen und mit einer Puffergröße von bspw. 1 KB in den Stream geschrieben werden.
Beispiele hierfür gibt es genügend, bspw. hier:
http://getablogger.blogspot.com/2008/01/android-how-to-post-file-to-php-server.html

Somit könnte man bspw. alle 1 KB den Fortschritt aktualisieren.
Das Problem: Android puffert den OutputStream auch dann, wenn man eine Content-Length mitgibt. Die Daten werden also beim Schreiben in den OutputStream noch gar nicht hochgeladen, sondern solange zwischengespeichert, bis die volle Content-Length erreicht ist. Die while-Schleife, die also eigentlich die Daten hochladen soll, ist somit in weniger als einer Sekunde durchlaufen, auch wenn es sich um eine 5MB Datei handelt. Erst mit dem Schreiben des letzten Bytes werden die Daten hochgeladen.
Die Schleife jedoch ist die einzige Stelle, an der man einen Fortschritt abgreifen kann. Somit fällt diese Möglichkeit leider raus.

2) Mit der Apache HttpClient 4
Eine weitere Möglichkeit besteht darin, zwei Bibliotheken von Apache einzubinden und den Upload mit MultipartEntity und HttpClient durchzuführen. Beispiel siehe hier:
http://linklens.blogspot.com/2009/06/android-multipart-upload.html

Hier jedoch gibt es das Problem, dass man noch weniger einen Fortschritt abgreifen kann, da der Upload einzig und allein (in einem Rutsch) mit HttpClient.execute(HttpPost) durchgeführt wird und hier überhaupt kein Stream zur Verfügung steht, in dem man Schrittweise den Upload "beobachten" bzw. melden könnte.


Hat jemand eine Idee, wie man mit Android (>= 1.6) einen Multipart Upload machen UND den Fortschritt des Uploads abgreifen kann?

/EDIT:
Inzwischen kenne ich die Möglichkeit, einen multipart/form-data Upload zu machen und einen Fortschritt anzugreifen.
Die erste genannte Möglichkeit (HttpUrlConnection) fällt raus, da es einen Bug / ein ungewöhnliches Verhalten im Zusammenhang mit durch UrlConnection gelieferte Streams gibt:
http://code.google.com/p/android/issues/detail?id=3164#c6
Dieses wird erst nach Froyo behoben, also nichts worauf man warten kann.

Die zweite Möglichkeit mit Apache HttpClient 4 und dem Einbinden zweier Bibliotheken funktioniert, wenn man einen Wrapper benutzt, wie er bspw. hier beschrieben wird:
http://stackoverflow.com/questions/3213899/cant-grab-progress-on-http-post-file-upload-android/3246050#3246050

Das Problem jedoch ist: Durch das Einbinden der beiden Bibliotheken (die Android SDK hat HttpClient nur unvollständig übernommen und speziell die Multipart-Fähigkeiten weggelassen) vergrößert sich die (installierte) App-Größe enorm. Statt vorher 175 KB hat mein App nun 732 KB, was für eine einzige Funktion (Fortschrittsanzeige) natürlich enorm und sehr unschön ist.

Daher die neue Frage:
Kennt jemand eine weitere Alternative, einen multipart/form-data Upload zu machen und dabei den Fortschritt abzugreifen? Gibt es irgendwelche anderen Bibliotheken die man hierfür benutzen könnte die insgesamt schlanker sind?

— geändert am 14.07.2010, 14:55:51

Antworten