base64 datei mit webservice erhalten

M

MandraKobold

Ambitioniertes Mitglied
3
Hallo,

ich steh mal wieder etwas auf dem Schlauch und zwar folgendes Problem:
mit KSOAP2 erfolgt eine anfrage an einen Webservice, bei erfolg, wird mir eine
base64 'datei' gesendet. Diese müsste ich nun speichern aber irgendwie komme ich an der stelle nicht weiter:

Code:
SoapObject response = (SoapObject) envelope.getResponse();
Ich erhalte also ein base64 und müsste diese nun encoden und dann speichern. Zum encoden habe ich die base64 Klasse von hier
iHarder.net Home Page gesichert. Ist diese notwendig ? Hat android eine eigene Klasse für diese Zwecke?

Denke das es gut wäre dass als Stream zu sichern ?!?

Freue mich über Eure Anregungen und Eure Meinungen zu dem Thema sowie, .. vielleicht ein paar codesnipes (?) :sleep:
Danke


LG
Mandra
 
Also wenn ich mich richtig erinnere, hatte man bei Android kaum Möglichkeiten zum ent- und verschlüsseln. Beim Googlen bin ich dann damals auf eine Klasse gestoßen, die von vielen empfohlen wurde. Ich glaube der Link gehört dazu: How to base64 encode decode Android | Android Code Monkey

Allerdings habe ich jetzt auch nochmal geschaut und unter android.util die gesehen: Base64 | Android Developers

Ich habe aber - wie gesagt - nur mit der oberen gearbeitet.

Noch ein Tipp am Rande: Wenn du schon base64 hast, müsstest du es de- und nicht encoden. Sonst ist dein Ergebnis doppelt encoded.
 
  • Danke
Reaktionen: MandraKobold
Danke für die Antwort.
Ja richtig habe mich mit dem en- und decoden etwas vertan.
Besteht eine Begrenzung bezüglich der grösse die über Ksoap übermittelt werden kann oder die base64 decoden kann??
Meine Datei die übermittelt wird kann bis zu 20MB haben, daher die Frage.

Edit:
Es sieht so aus als wenn es eine Begrenzung geben würde, allerdings weiss ich noch nicht ob es tatsächlich eine Begrenzung der oben gennaten entspricht oder
ober der ram nicht ausreicht, die Daten zwischen zu speichern.
Vielleicht mal ein stück code:

Code:
    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

        try {
            // built a connection
            androidHttpTransport.call(SOAP_ACTION, envelope);

            // Get the SoapResult
            SoapPrimitive resultsRequestSOAP = (SoapPrimitive) envelope
                    .getResponse();

                // Do something with the download data
                String result = resultsRequestSOAP.toString();
                if (result != "") {
                    byte[] b= Base64.decode(result, Base64.DEFAULT);

                       ByteArrayInputStream test = new ByteArrayInputStream(b, 0,
                            b.length);
                    String rootpath = gd.getSDRootPath() + File.separator;

                    OutputStream fOut = new FileOutputStream(new File(
                            rootpath, gd.getProjectName() + ".zip"));
                    int byteCount = 0;
                    byte buffer[] = new byte[1024];
                    
                    int bytesRead = -1;
                    while ((bytesRead = test.read(buffer)) != -1) {
                    
                        byteCount += bytesRead;
                        fOut.write(buffer, 0, bytesRead);
                    

                    }
                    fOut.flush();
                    fOut.close();
                }    

        } catch (Exception e) {
           // ToDo
        }
Da ich weiss dass bestimmte Dateien, die von einem Server bezogen werden, grösser sind (bis 20MB) und nicht verarbeitet werden,
aber kleinere Dateien ohne probleme mit der oben gennaten codeteil verarbeitet werden können, liegt die vermutung nahe dass es wohl
mit der grösse der Datei zusammenhängt.
Hat jemand bereits Erfahrung mit Ähnlichem und könnte mir einen Tip geben?
Sollte ich vielleicht einen anderen Ansatz als KSOAP verfolgen oder die Datei gestückelt werden (was ungern passieren sollte)??

DANKE
 
Zuletzt bearbeitet:
Ich wüsste nicht, warum es bei der Base64 Klasse eine Limitierung der Dateigröße geben sollte. Ich vermute sehr stark, dass es ein RAM Problem ist. Sieh dazu einfach mal in Logcat nach, das steht dort exakt drin.

Weiterhin kann man das auch ganz leicht mit der normalen JVM überprüfen. Schreibe doch mal eine Testklasse und überprüfe die Base64 Klasse, ich könnte wetten, dass es dort funktioniert.

Zu KSOAP kann ich nicht viel sagen.
 
Hallo,

ich muss das Thema leider noch einmal aufgreifen.
Bis zu einer bestimmten grösse von Daten, die vom WebService kommen funktioniert alles ohne Probleme. Allerdings treten ab einer grösse von mehr als 10 MB die Probleme auf.
Im LogCat steht das der Heap ständig vergrössert wird, nur dass der nicht ausreicht so das die Methode ein Dauerläufer wird ohne Ergebnis (habe es eine halbe Stunde laufen lassen).
Das Problem tritt an folgender stelle auf :

Code:
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); //--------------------- ab hier 
     androidHttpTransport.call(SOAP_ACTION, envelope);
//---------------------
Kann es sein, dass die Methode nur eine bestimmte grösse an zurückerhaltenen Daten verarbeiten kann?
Der RAM vom Handy ist 1GB, kann das bei der grösse wirklich ein Problem sein??
Hat jemand ähnlich Erfahrungen mit diesen Methoden/Klassen und/oder kann mir eine alternative nennen?
Würde mich sehr freuen. Danke

LG
Mandra
 
Damit habe ich noch nicht gearbeitet. Zum RAM kann ich aber sagen, dass 1GB nicht viel aussagt. Es kommt auf die Heap Größe an, die eine App nutzen darf. 10mb sollten aber im Rahmen sein. Allerdings können auch große Bilder nervende Probleme bereiten. Ist immer ein ziemliches Gefrickel (besonders wenn man hardwareschwache Geräte unterstützen muss).

Ich hoffe, jemand kann dir noch besser helfen.
 
Danke.
Es scheint wirklich die Heap grösse zu sein, die wohl bei manchen Geräten +/- 16 MB beträgt, das hängt aber auch mit der OS Version zusammen.
Meinem Galaxy S2 scheint das nicht genug zu sein. Daher werde ich mich jetzt daran versuchen den InputStream direkt zu speichern und dann zu parsen.
Gerade wie du schon sagst auch Hardware schwache Geräte unterstützt werden sollten.
Werde mich wieder melden wenn ich ne Lösung habe oder hier jemand noch einen Tip hat.

LG
 

Ähnliche Themen

B
Antworten
4
Aufrufe
496
bb321
B
M
  • MikelKatzengreis
Antworten
5
Aufrufe
136
swa00
swa00
S
Antworten
33
Aufrufe
2.676
Sempervivum
S
Zurück
Oben Unten