Wie geht man mit Bildern in einer Datenbank oder Server um?

  • Hallo zusammen,


    ich möchte eine Wallpaper App machen, ich frage mich nun
    was wäre der beste Weg mit den Bildern umzugehen`?


    Bisher habe ich die Bilder auf dem Server gespeichert, den Link in die Datenbank geschrieben
    und mit Picasso in die App geladen.


    Ist das gut, oder gäbe es eine bessere alternative?

  • hi,
    ich möchte zu diesem Thema anknüpfen und nicht unnötig ein neues Thread aufmachen. Ich stehe derzeit vor einem ähnlichen Problem.
    Bisher habe ich (im Web Umfeld) die Profil-Bilder der User als Base64 in der DB gespeichert. Der Verwaltungsaufwand ist dadurch viel geringer.
    Das selbe habe ich nun in der App probiert. Das Problem ist nun, dass es Minuten !!! dauert, bist die Bilder dann in den entsprechenden Image-Views angezeigt werden. Das sind zwar 20 Bilder, aber sehr kleine, die wiegesagt vom Browser in Sekunden heruntegeladen und dargestellt wurden.


    Was ist der Standard-Weg, wenn user in einer ganz gewöhnlichen Community-App ihr Bilder hochladen. Base64 oder doch Links in DB speichern ? oder ein anderer Weg ?


    danke...

  • Hallo liny
    Was der Standart ist kann ich dir leider nicht sagen.
    Wenn du die Bilder hochladen also übers Web verschicken zb als Email Anhang dann kommt meist base64 zum Einsatz.
    Du willst so wie ich es verstehe aber die Bilder lokal in der dem Handy speichern. Dazu brauchst du sie nicht in base64 zu konvertiere es findet ja keine Übertragung im Internet statt.
    Ich würde die Bilder in der DB mit Datentyp Blob speichern. Wenn sie wirklich so klein sind.
    Das es solange dauert kann auch an deinen Code ligen für so etwas benutzt man mehrre
    threads was der Browser wahscheinlich auch macht.

  • Hallo,
    die Bilder will ich im Internet speichern. Ganz normale Geschichte: Der eingeloggte User kann sein Profil-Bild hochladen.
    Das habe ich bisher ganz gut mit einem HTML-Formular Feld erledigt. Auf dem Server habe ich die Bild-Datei aufgegriffen, es in base64 umgewandelt und schließlich in der DB gespeichert.


    Als eine Liste der User (wie eine ListView) angezeigt werden musste habe ich habe ich einfach mit einer SELECT-Query neben den anderen Columns wie uid und username usw die Spalte mit dem Bild abgefragt.
    Die Anfrage ging über ein Ajax-Request.
    Von Start der Anfrage bis zum Anzeigen der Bilder (<img src="base64..... />) dauerte es Bruchteile einer Sekunde, wie es sich eben gehört.


    Aber jetzt in Android dauert es Minuten. Der Download erfolgt im AsyncTask. Die Seite wird schon angezeigt, aber bis der RecyclerView mit den Bildern erscheint dauert es Minuten.


    Irgendetwas stoppt das ganze. Kann es sein, dass die Zurückkonvertierung von base64 so lange dauert ?

  • Hi
    Kann und will eigentlich nicht glauben das es am Recyclerview oder dem Konvertieren liegt. Denke eher das in deiner Download Routine was schief läuft.
    Vielleicht Protest du mal den Code. Oder baust Logs in deinen Code ein um festzustellen wo die grosse Verzögerung ist.


    Bin mir auch nicht so sicher ob die Ajax-Request Schnittstelle für den download so sinnvolle ist . Wie gut wir das den von Android unterstütz?
    Hast du dafür eine Bibliothek benutz oder hast alles selber gemacht?


    Im allgemein findet ein Austausch auf XML ebene zwischen Server und Browser Stadt. Wenn du nun einen normalen Download machst konnte sein das der Server noch auf irgendwelche Daten wartet und erst nach einem timeout die Daten sendest.
    Also ich vermute den Fehler in dieser Richtung. Kannst das ja vielleicht mal auf deinen Server kontrollieren oder einen normalen http Download anbieten.

  • ich habe nur herausgefunden, dass dieser code zwischen Log.i start und Log.i end 20 Sekunden in Anspruch nimmt:


    wa smache ich da falsch ?

  • versuche se mal in etwa so

    Code
    StringBuilder str = new StringBuilder();
    		BufferedReader br = new BufferedReader(new InputStreamReader(httpconnection.getInputStream()));
    		String line = "";
    		while ((line = br.readLine()) != null) {
    			str.append(line + System.getProperty("line.separator"));
    		}
  • Frage von welchen datentyp ist result.?
    Mein Code geht von einer Text Datei aus . Da base64 auch nur Text ist sollte es gehen . Müsstest wahrscheinlich den separator weglassen.


    Das dein Code so lange läuft ist kein Wunder. Das ist auch ein Speicher fressen.
    Du holst ein Zeichen weist es einer neu erstellten Variablen zu dann noch mal einer variablen .
    Zu guter letzt ich denke result ist ein String und genau da ist das Problem . Schaue dir mal an was Java macht wenn du an einen String etwas anhängt. Es wird erst ein neuer Speicherbereich erstellt und der String in den neuen Bereich kopiert danach wird der alte Speicher irgendwann wider freigeben. Und genau das bei jedem schleifen durchlauf.
    Deshalb arbeitet man mit buffern.

  • jogimuc vielen Dank.


    Das hat mir geholfen. Jetzt läuft es so wie ich es wollte.
    Seltsam, dass in den vielen Tutorials und Video-Kursen die ich bereits durchgelernt habe das keine Erwähnung findet.
    (Die Antwort vom Server ist ein Json String. Also reiner Text.)


    Danke nochmal...

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!