Wie verwende ich BLOB mit JSON und PHP?

8

Ich habe eine entfernte Datenbank mit MySQL, und ich speichere Fotos der Benutzer meiner App in der Datenbank als eine Zeile der Datenbank mit LONGTEXT-Typ.

Ich verwandle die Fotos mit Base64 in eine Zeichenkette.

Ich verbinde mich mit JSON und PHP mit meiner entfernten Datenbank, weil ich Base64 verwenden muss, weil ich weiß, dass JSON und PHP Zeichenfolgen für die Parameter senden müssen, und mit Base64 kann ich das Foto in eine Zeichenfolge umwandeln .

Es funktioniert gut, aber es ist sehr langsam. Wenn ich ein Foto von 100 KB geladen habe, dauert es sehr lange, aber wenn ich ein Foto von 5 KB geladen habe, dauert es nur zwei oder drei Sekunden.

Ein Freund sagte mir, ich solle BLOB anstelle von Base64 verwenden, aber wie verwende ich BLOB mit JSON und einer PHP-Verbindung zur Datenbank? Außerdem muss ich die Bilder in einer Zeile der Tabelle USER speichern. Dies liegt daran, dass die Benutzer nicht berechtigt sind, Dateien auf den Remote-Server hochzuladen, aber sie können Fotos hochladen, indem sie sie als Zeichenfolge in einer Zeile der Tabelle USER hochladen.

Danke

BEARBEITEN:

Dies ist der Code, wo es eine Wartezeit dauert (es wartet in der Zeile: while ((line = reader.readLine()) != null) { , es wartet auf reader.readLine() )

Dieser Code ruft einen Benutzer aus der entfernten Datenbank ab, es dauert ein wenig Zeit, um den Benutzer auf meiner App zu zeigen

%Vor%     
NullPointerException 31.01.2011, 19:59
quelle

4 Antworten

8

Teilen Sie die Anfrage in zwei Teile:

  • Zuerst wird der JSON mit allem außer dem Bild heruntergeladen, stattdessen wird ein Verweis auf das Bild als URL zurückgegeben
  • Laden Sie das Bild als Binär-Chunk herunter, möglicherweise asynchron abhängig von der App

Ich nehme an, Sie haben etwas wie Ссылка als Endpunkt, der den JSON zurückgibt? Fügen Sie einen Endpunkt wie Ссылка hinzu, um nur das Bild zurückzugeben, und dann können Sie es als binären Block anstelle von Base64 zurückgeben, der es im JSON codiert .

Es bedeutet, dass Sie zwei HTTP-Anfragen statt einer Anfrage machen, aber abhängig von der App können Sie das Bild asynchron laden, und wenn dies der Fall ist, erhalten Sie normalerweise eine große Steigerung der wahrgenommenen Antwortzeit der Anwendung / p>

Informationen über das verzögerte Laden von Bildern im Hintergrund finden Sie im Blog des Android-Entwicklers für ein Beispiel:

Ссылка

Wenn Sie das Bild nicht faul laden können, sollten Sie parallele Anforderungen sowohl für das Bild als auch für den JSON gleichzeitig berücksichtigen. Da die binäre Version des Bildes viel weniger Netzwerkbandbreite benötigt und viel weniger Verarbeitung, sobald Sie die Daten auf das Mobilteil bekommen, sollte es immer noch viel schneller erscheinen.

    
mikerowehl 31.01.2011, 20:47
quelle
1

Warum nicht Ihr Bild als Datei auf dem Server ablegen und die URL der geschriebenen Datei in Ihrem json zurückgeben? Dies ist wirklich, wie Sie tun sollten, was Sie tun möchten, da http das Protokoll ist, das Sie für die Übertragung von Bildern über das Web verwenden sollten.

Code ähnlich wie sollte tun, was Sie auf dem Server wollen

%Vor%

Damit werden Ihre Blob- oder Longtext-Felder als Datei auf Ihrem Server geschrieben, die Sie dann von Ihrer mobilen App herunterladen können. Sie können diese temporären Dateien nach einem Intervall löschen.

Ich hoffe, das ist nützlich

    
Toby Allen 31.01.2011 20:31
quelle
1

Um Ihre Frage zu beantworten: Nein, JSON unterstützt keine binären Daten. Sie müssen sie vor dem Senden in irgendeiner Weise entfernen. Wenn Sie es als BLOB in MySQL speichern, werden Sie die wichtigsten Infrastrukturprobleme, die Sie haben, nicht beheben können.

Soweit ich weiß, haben Sie ein Android-Gerät, das ein Bild auf einen PHP-Server hochlädt. Dieser PHP-Server kodiert das Bild in Base64, legt es in eine JSON-Zeichenkette und stellt es dann auf eine Fernbedienung ? same Datenzentrum? über das Land? auf der ganzen Welt? im Weltraum um den Mond oder?) MySQL Server über eine HTTP-Schnittstelle irgendeiner Art, dass MySQL Server das Base64 Bild als LONGTEXT speichert. Um das Image zurück zu bekommen, sendet der Android Client eine Anfrage an PHP, PHP sendet eine Anfrage an den entfernten MySQL Server, PHP muss dann Base64 das Image entschlüsseln und es senden.

Das ist schrecklich ineffizient, Sie werden Latenz bei jedem Schritt des Weges leiden.

Bearbeiten: Okay, es sieht so aus, als wäre dies ein Client-seitiges Problem und kein serverseitiges Problem ...

Wenn das der Fall ist, würde ich vorschlagen, die Posts @ zu überprüfen Hochladen von Bildern auf einen PHP-Server von Android , da sie einige effizientere Beispiele haben sollten.

    
Klinky 31.01.2011 20:24
quelle
0

Ist die Langsamkeit, die von json / base64 kommt, für die Kodierung von 100 K Daten oder von der Datenbank betroffen? Es ist wahrscheinlich von der Kodierung, und die Dateien in das Dateisystem zu setzen (wie jeder in den Kommentaren weint), in kleinem Maßstab, wird keinen Unterschied machen.

Machen Sie einige Messungen an den verschiedenen Teilen der Operation und versuchen Sie herauszufinden, warum es langsam ist. Ich weiß nicht, wie sonst man einen Image-Blob ohne base64 in eine json-codierte Zeichenkette bringen könnte. Ich nehme an, man könnte versuchen, alles zu entkommen, was genauso langsam sein könnte und hoffen, dass der Parser nicht daran erstickt.

Verwenden Sie die Funktion json_encode in PHP oder erstellen Sie die Zeichenfolge manuell? Versuchen Sie es manuell zu erstellen. Sind Sie base64, um Rohdaten aus der Datenbank zu codieren, oder wird sie vor der Speicherung codiert, sollten Sie sie vor der Speicherung codieren, um bei der Ausgabe Zeit zu sparen.

    
profitphp 31.01.2011 20:14
quelle

Tags und Links