Image aus MySQL aulesen :(

  • Antworten:3
Michael
  • Forum-Beiträge: 19

06.06.2012, 11:21:10 via Website

Hi Leute,

ich hab ein kleines Problem mit dem Auslesen eines Images aus meiner MySQL DB. Im Netz habe ich schon ziemlich viel gesucht und auch einiges gefunden, aber nichts hat mein Problem gelöst (bin halt noch ein relativer Anfänger :))

Also ich habe eine MySQL DB in der ich in einer Tabelle Bilder speichere. Das Tabellenfeld ist vom Typ "long blob". Die Bilder habe ich mittel PHP Admin hochgeladen.

Nun würde ich diese gerne wieder mittels meiner App laden und anzeigen.
Hier mal etwas Code:

PHP

1$drivers = $db->getAllDriver();
2 if ($drivers != false) {
3 while($driver=mysql_fetch_assoc($drivers))
4 {
5 // plans found
6 // echo json with success = 1
7 // response Array
8 $response = array("tag" => $tag, "success" => 0, "error" => 0);
9 $response["success"] = 1;
10 $response["_id"] = $driver["_id"];
11 $response["lastname"] = $driver["lastname"];
12 $response["firstname"] = $driver["firstname"];
13 $response["email"] = $driver["email"];
14 $response["mobile"] = $driver["mobile"];
15
16 //getting image
17 $db_img = $driver["image"];
18// $db_img = base64_decode($db_img);
19
20 $db_img = imagecreatefromstring($db_img);
21 if ($db_img != false)
22 {
23 // header("Content-Type: image/png");
24 imagepng($db_img);
25 }
26 $response["image"] = $db_img;
27 imagedestroy($db_img);
28 $response["postal"] = $driver["postal"];
29 $output[]=$response;
30 }
31 echo json_encode($output);
32
33 } else {
34 // no plans not found
35 // echo json with error = 1
36 $response["error"] = 1;
37 $response["error_msg"] = "Incorrect request. No driver found!";
38 }

1/**
2 * Get all Driver
3 */
4 public function getAllDriver() {
5 $result = mysql_query("SELECT * FROM `fahrer`") or die(mysql_error());
6 // check for result
7 $no_of_rows = mysql_num_rows($result);
8 if ($no_of_rows > 0) {
9 return $result;
10 } else {
11 // user not found
12 return false;
13 }
14 }

Bei meiner Suche habe ich erfahren, dass PHPAdmin Bilder nicht codiert speichert. Dann habe ich die Zeile :
$db_img = base64_decode($db_img); entfernt mit folgendem Ergebnis:

json_encode() [<a href='http://de.php.net/function.json-encode'>function.json-encode</a>]: type is unsupported, encoded as null in
(davor stehen dann noch recht viele Sonderzeichen : PNGn.....

Wenn ich $db_img = base64_decode($db_img) verwende, habe ich das Ergebnis:
1<style>.bpe a:link, .bpe a:visited, .bpe a:active { color: #0b4c8e; text-decoration: none; } .bpe a:hover { color: #0D7CEC; }</style>n<span class="bpe" style="font: 11px/1.2em Verdana, sans-serif;"><br />n<b>Warning</b>: imagecreatefromstring() [<a href='http://de.php.net/function.imagecreatefromstring'>function.imagecreatefromstring</a>]: Empty string or invalid image in <b>/users/spike78/www/fahrgemeinschaft/index.php</b> on line <b>75</b><br />n</span><style>.bpe a:link, .bpe a:visited, .bpe a:active { color: #0b4c8e; text-decoration: none; } .bpe a:hover { color: #0D7CEC; }</style>n<span class="bpe" style="font: 11px/1.2em Verdana, sans-serif;"><br />n<b>Warning</b>: imagedestroy() expects parameter 1 to be resource, boolean given in <b>/users/spike78/www/fahrgemeinschaft/index.php</b> on line <b>82</b><br />n</span>[{"tag":"all_driver","success":1,"error":0,"_id":"1","lastname":"Kunz","firstname":"Michael","email":"michael.kunz@softwareag.com","mobile":"015124204101","image":false,"postal":""}]n


Und hier noch meine Funktion in meiner App:

1public JSONArray getJSONFromUrl(String url, List<NameValuePair> params) {
2
3 // Making HTTP request
4 try {
5 // defaultHttpClient
6 DefaultHttpClient httpClient = new DefaultHttpClient();
7 HttpPost httpPost = new HttpPost(url);
8 httpPost.setEntity(new UrlEncodedFormEntity(params));
9
10 HttpResponse httpResponse = httpClient.execute(httpPost);
11 HttpEntity httpEntity = httpResponse.getEntity();
12 is = httpEntity.getContent();
13
14 } catch (UnsupportedEncodingException e) {
15 e.printStackTrace();
16 } catch (ClientProtocolException e) {
17 e.printStackTrace();
18 } catch (IOException e) {
19 e.printStackTrace();
20 }
21
22 try {
23 BufferedReader reader = new BufferedReader(new InputStreamReader(
24 is, "iso-8859-1"), 8);
25 StringBuilder sb = new StringBuilder();
26 String line = null;
27 while ((line = reader.readLine()) != null) {
28 sb.append(line + "n");
29 }
30 is.close();
31 json = sb.toString();
32 Log.e("JSON", json);
33 } catch (Exception e) {
34 Log.e("Buffer Error", "Error converting result " + e.toString());
35 }
36
37 // try parse the string to a JSON object
38 try {
39 jArray = new JSONArray(json);
40 } catch (JSONException e) {
41 Log.e("JSON Parser", "Error parsing data " + e.toString());
42 return null;
43 }
44
45 // return JSON String
46 return jArray;
47
48 }

Ich hoffe ihr könnt mir weiterhelfen. Ich habe schon alles probiert, was ich finden konnte aber ich komme einfach nicht auf den Fehler :(

Vielen Dank für Eure Hilfe...

Gruß

Michael

Antworten
Maximilian O
  • Forum-Beiträge: 990

06.06.2012, 13:11:58 via Website

Hast du mal mit dem Debugger geschaut wo er rausfällt? Log Ausgaben?

Vergiss nie wieder Geburtstage, oder viel schlimmer, deinen Hochzeitstag - Birthdays Download

Antworten
Michael
  • Forum-Beiträge: 19

06.06.2012, 13:52:53 via Website

Also wenn ich mir an dieser Stelle den Inhalt ansehe:

json = sb.toString();
Log.e("JSON", json);

Bekomme ich: json =PNGn->n und als Value viele Sonderzeichen.

PHP Syntax ist so:
1$db_img = $driver["image"];
2//$db_img = base64_decode($db_img);
3$db_img = imagecreatefromstring($db_img);
4if ($db_img != false)
5{
6imagepng($db_img);
7}
8$response["image"] = $db_img;
9//imagedestroy($db_img);

Beim Parsen fliegt dann diese Meldung:
06-06 13:54:10.460: E/JSON Parser(2362): Error parsing data org.json.JSONException: Value ?PNGnn??????nIHDR??????F?????? ......


Gruß

Antworten
Felix
  • Forum-Beiträge: 259

07.06.2012, 21:38:55 via Website

Tach!

Michael
Also ich habe eine MySQL DB in der ich in einer Tabelle Bilder speichere. Das Tabellenfeld ist vom Typ "long blob". Die Bilder habe ich mittel PHP Admin hochgeladen. [...] Bei meiner Suche habe ich erfahren, dass PHPAdmin Bilder nicht codiert speichert.

Warum sollte es das auch? Du hast ein BLOB-Feld, in dem du problemlos Binärdaten speichern kannst. Es ist nicht notwendig, da noch was zu kodieren (außer beim Transport hin zu MySQL, wenn die Daten in ein Statement eingebettet werden sollen).


// $db_img = base64_decode($db_img);
$db_img = imagecreatefromstring($db_img);

Was bezweckst du mit dem Erzeugen einer Bild-Ressource? Willst du das Bild noch bearbeiten? Wenn nicht, kannst du die Daten gleich direkt ausgeben (oder kodiert in die Ausgabe einbetten). Außerdem will imagecreatefromstring() Binärdaten und keine Base64-kodierten haben.

// header("Content-Type: image/png");
imagepng($db_img);
[...]
echo json_encode($output);

Erst gibst du das Bild als solches aus (mit oder ohne korrektem Content-Type) und anschließend Text-Daten. Das geht so nicht. Das ist ähnlich wie bei HTML, da kannst du auch nicht das Bild direkt in den HTML-Code einfügen. (Was aber geht ist sowas wie <img src="data:image/png;base64,DATEN">.) In deinem Fall aber willst du neben dem Bild noch weitere Daten und diese JSON-kodiert übertragen. Dann solltest du die Bild-Daten in eine Text-Form bringen, wofür sich Base64 eignet und diese Base64-Bild-Daten als Teil deines JSON-Results einbinden.

Dann habe ich die Zeile :
$db_img = base64_decode($db_img); entfernt mit folgendem Ergebnis:

json_encode() [<a href='http://de.php.net/function.json-encode'>function.json-encode</a>]: type is unsupported, encoded as null in
(davor stehen dann noch recht viele Sonderzeichen : PNGn.....

Das sind eigentlich keine Zeichen sondern Binärdaten. Sie sich als Text anzeigen zu lassen führt zu keinem gescheiten Ergebnis.

Wenn ich $db_img = base64_decode($db_img) verwende, habe ich das Ergebnis:
1<style>.bpe a:link, .bpe a:visited, .bpe a:active { color: #0b4c8e; text-decoration: none; } .bpe a:hover { color: #0D7CEC; }</style>n<span class="bpe" style="font: 11px/1.2em Verdana, sans-serif;"><br />n<b>Warning</b>: imagecreatefromstring() [<a href='http://de.php.net/function.imagecreatefromstring'>function.imagecreatefromstring</a>]: Empty string or invalid image in <b>/users/spike78/www/fahrgemeinschaft/index.php</b> on line <b>75</b><br />n</span><style>.bpe a:link, .bpe a:visited, .bpe a:active { color: #0b4c8e; text-decoration: none; } .bpe a:hover { color: #0D7CEC; }</style>n<span class="bpe" style="font: 11px/1.2em Verdana, sans-serif;"><br />n<b>Warning</b>: imagedestroy() expects parameter 1 to be resource, boolean given in <b>/users/spike78/www/fahrgemeinschaft/index.php</b> on line <b>82</b><br />n</span>[{"tag":"all_driver","success":1,"error":0,"_id":"1","lastname":"Kunz","firstname":"Michael","email":"michael.kunz@softwareag.com","mobile":"015124204101","image":false,"postal":""}]n

Das heißt also, du hast da ein ziemliches Kuddelmuddel. Erst kommt ein Teil HTML, gespickt mit Fehlermeldungen von PHP, und anschließend JSON-kodierte Daten. Vielleicht sortierst du erstmal aus, was du eigentlich zum Client senden willst.


Felix.

Antworten