Tiff (binär) aus Datenbank auslesen

Crav3X

Erfahrenes Mitglied
Hallo,

ich habe in einer MSSQL Datenbank einen eintrag in DATEI mit dem Binärcode eines .tiff Images. Dies möchte ich nun aus der Datenbank auslesen und anzeigen.

Mein Ansatz war:

PHP:
error_reporting(E_ALL);

$db_server = "localhost";
$db_name = "Datenbank";
$db_user = "user";
$db_passwort = "passwort";

$db = @MSSQL_CONNECT($db_server,$db_user,$db_passwort);
@MSSQL_SELECT_DB($db_name);

$res = mssql_query("SELECT DATEI FROM DAT_VORGANG_DETAIL WHERE VORGANG_ID =10170");

$data = mssql_result($res, 0, "DATEI");
header("Content-Type: image/tiff");
header("Content-Transfer-Encoding: binary");
header("Content-length: " . strlen($data));


//Nachtrag...
echo $data;

@MSSQL_CLOSE($db);

Leider bekomme ich Local nur leere Datein ausgegeben (0 Byte)
Und auf nem anderen Server bekomme ich verhackte Bilder...

Hat jemand einen anderen Lösungsweg?

Sofern ich das Tiff Image ausgegeben bekomme, müsste ich es am besten als jpg haben. Gibt es da einen einfachen weg? Das Bild VORHER in der Datenbank als jpg zu speichern ist nicht möglich.

Danke
 
Zuletzt bearbeitet:
Hi,

ich glaube dein Problem ist einfach, dass du den Inhalt der Datei nicht wieder gibst oder habe ich was überlesen?
Du ließt die Binary zwar in $data ein, aber wo wird es ausgegeben? Ich würd nach den headern ein echo setzen und den Inhalt der $data ausgeben.

Wenn du ein Bildaufrifst, kriegst du ja auch nicht nur die header geschickt, sondern die eigentliche Binary (also das Bild) mit.
 
Hi,

ich glaube dein Problem ist einfach, dass du den Inhalt der Datei nicht wieder gibst oder habe ich was überlesen?
Du ließt die Binary zwar in $data ein, aber wo wird es ausgegeben? Ich würd nach den headern ein echo setzen und den Inhalt der $data ausgeben.

Wenn du ein Bildaufrifst, kriegst du ja auch nicht nur die header geschickt, sondern die eigentliche Binary (also das Bild) mit.

Hey, danke für die Antwort.
Das Problem mit meinem Localen Script ist nun behoben und es wird ausgegeben... leider aber immer noch defekt... (schwarze streifen, fehlender inhalt etc)

Mein ASP Code jedoch gibt es richtig ohne Probleme aus.

Code:
' Daten Auslesen
SQL	= "SELECT DATEI FROM DAT_VORGANG_DETAIL "&_
	" WHERE VORGANG_ID = "& Int(ToMSInt(Session("vorgangsid")))
'xx sql
set rs1 = server.CreateObject ("ADODB.Recordset")
rs1.Open sql ,db ,0 , 1
	if not rs1.EOF then
		Datei = rs1.Fields("DATEI")
	else
		xx "Datei wurde nicht gefunden"
	end if
rs1.close

Response.ContentType = "image/tiff"
response.binarywrite Datei
 
Greifst du denn mit asp auf den selben Datenbankeintrag zu wie mit PHP? Vielleicht ist beim hoch laden was schief gegangen.
Ansonsten könnte auch der Browser bzw. das Plugin den Fehler verursachen.

Ich habe leider keine Erfahrungen mit tiff. Habe bisher nur jpg hoch geladen und angezeigt, da gab es allerdings nie Probleme solcher Art.
 
Ist die Selbe MS SQL Datenbank. Selber Eintrag, nur ein anderes Ergebniss...
weiß auch nicht mehr weiter...:confused:
 
Hi,

versuche mal statt strlen ($data) filesize ($data).

Ich vermute, des es daran liegt. Wenn nicht, weis ich grad auch nicht weiter :)
 
Nein, dann zeigt das .tiff nichts an...
strlen(); ja wegen des Binär Codes.... Es liegt ja so nicht als Datei vor sondern als Binärer Code in der Datenbank.

Weiß nicht mehr weiter... hmm... echt doof
 
Hi.

Die Größe der Daten solltest du aus der Datenbank erhalten können:
SQL:
select datalength(spalte) from tabelle where ...
Gruß
 
Hi.

Die Größe der Daten solltest du aus der Datenbank erhalten können:
SQL:
select datalength(spalte) from tabelle where ...
Gruß

datalength() gibt mir nur ein wert von 5.
durch strlen() aber 4096 was etwas warscheinlicher klingt.

Problem ist dennoch dass das Bild total verzerht ist.
Im Anhang ein Beispiel einer gescannten Rechnung.

Vllt hat auch jemand Erfahrung mit ImageMagic gesammelt und könnte mir ein Lösungsansatz in die Richtig geben... am besten das Tiff Bild aus der Datenbank direkt in ein JPG zu Convertieren.
 

Anhänge

  • tiff.jpg
    tiff.jpg
    66,4 KB · Aufrufe: 27
Hallo,

bin immer noch an dem ding dran. Bisher keine Lösung gefunden. Hab auch schon versucht von mssql das TIFF mit CAST nochmal als binary aus zu geben... aber das funktioniert auch nicht. Hat sonst jemand eine Idee wie ich das Problem in den Griff bekommen könnte? Wäre echt super wenn das klappt. Verstehe einfach nicht wieso es in ASP funktioniert und in PHP nicht.

Hier nochmal den ASP Teil und den PHP Teil zum vergleich.

Code:
' Daten Auslesen
SQL	= "SELECT DATEI FROM TABELLE "&_
	" WHERE VORGANG_ID = "& Int(ToMSInt(Session("vorgangsid"))) &_
	" AND TIFF_SEITE = " & Int(ToMSInt(Session("AktuelleSeite")))
'xx sql
set rs1 = server.CreateObject ("ADODB.Recordset")
rs1.Open sql ,db ,0 , 1
	if not rs1.EOF then
		Datei = rs1.Fields("DATEI")
	else
		xx "Datei wurde nicht gefunden"
	end if
rs1.close

Response.ContentType = "image/tiff"
response.binarywrite Datei
______

PHP:
error_reporting(E_ALL);
session_start();
include("include/connect.php");
$db = @MSSQL_CONNECT($db_server,$db_user,$db_passwort);
@MSSQL_SELECT_DB($db_name);

$sql = "SELECT DATEI, datalength(DATEI) AS Length  FROM TABELLE WHERE VORGANG_ID =10182 AND TIFF_SEITE =".$_SESSION["AktuelleSeite"];
$res = mssql_query($sql);

$data = mssql_fetch_array($res);

header("Content-Type: image/tiff");
header("Content-Transfer-Encoding: binary");
header("Content-length: ".strlen($data[0]));

echo  $data[0];

Beide Scripts nutzen die selbe Datenbank und selben Eintrag. Hoffe mir kann jemand ein Tipp geben. Vielen Dank


EDIT:

Ich bin weiter gekommen... habe das alles nochmal gemacht. Diesmal mit einer MySQL Datenbank. Habe das TIFF in die Datenbank geschrieben. Diesmal aber als BLOB (longblob) mit Attribute BINARY.

Es ist das Selbe TIFF in beiden Datenbanken. Über MySQL funktioniert es ohne Probleme.
Größe der Datei nach strlen() = 82772.

Größe bei der MSSQL Datenbank nach strlen() = 4096.

Daher wissen wir jetzt also was das Problem ist. Habe bei einem Text aus der MSSQL Datenbank schonmal das Problem gehabt... das mir nur 255Zeichen übergeben wurden, obwohl in der Datenbank viel mehr stand. Varchar(1024). Mit CAST(text AS TEXT) hat es dann ohne Probleme funktioniert.

Nur wie mach ich das bei meiner Binären Spallte!? Mir ist leider die MSSQL Datenbank gegeben in der die Daten so vorhanden sein müssen.

MSSQL Spallte sieht so aus DATEI(image, NULL).

CAST(DATEI as IMAGE) geht nicht. Von IMAGE kann man auch nur in binary und varbinary Casten...


Hoffe das hilft weiter euch mir zu helfen^^ wasn satz.

:)
 
Zuletzt bearbeitet:
Zurück