M
mndroid
Neues Mitglied
- 7
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:
Yet another blog: Android: How to post file to a php server
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:
Sam's Technical Blog: Android Multipart upload
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?
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:
Yet another blog: Android: How to post file to a php server
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:
Sam's Technical Blog: Android Multipart upload
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?