Zum Inhalt springen

Oracle ORD Image


bob0108

Empfohlene Beiträge

Hallo,

ich habe ein Problem mit Oracle interMedia. Ich weiß nicht wie ich mir die Bilder mit PHP ausgeben lassen kann die ich in der Datenbank gespeichert habe.

Ich habe die Tabelle 'tbl_picture' erstellt:

create tbl_picture (

picid number(8) not null,

bild ordsys.ordimage not null,

constraint pk_tbl_pic primary key (picid));

Ich habe in der Tabelle erfolgreich ein Bild gespeichert. Wie kann ich das Bild jetzt aus der Datenbank ausgeben lassen.

Ich sitze schon zwei Tage daran und weiß einfach nicht mehr wo mein Fehler liegt. Kann mir jemand weiterhelfen oder weiß jemand einen guten Link wo alles erklärt wird.

Das hier hab ich als Grundlage genommen:

http://www.knebler.de/Hilfe-PHP/Oracle_Intermedia_mit_PHP_nutzen_.php3

Vielen Dank. Christian

Link zu diesem Kommentar
Auf anderen Seiten teilen

die im von dir angegebenen tutorial beschriebe funktion GetPicture liefert dir nach übergabe der bildnummer (IN_sessionid) den mimetype (OUT_Mimetype) als call by reference-parameter und den blob als returnwert.

mit dem beschriebenen

$BinaryBild = $blob->load();
werden dann in die php-variable $BinaryBild die raw-daten der bilddateidatei abgelegt und können mit der php-funktion echo in den ausgabepuffer geschrieben werden. voraussetzung ist, dass das aufrufende php-script den content-type richtig setzt, sodass der client (sprich, browser) auch was damit anfangen kann:
header ("Content-Type: ".$sMimetag); 

echo $BinaryBild; 

im übrigen sollte es völlig egal sein, ob deine bilddaten über die ORDSYS (also oracle intermedia) verarbeitet werden oder nicht - es sind alles ohnehin daten typ BLOB oder CLOB.

deine grundlage ist gut - bekommst du irgendwelche fehlermeldungen oder weisst du nicht wie du das implementieren kannst?

s'Amstel

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

erstmal vielen Dank für deine schnelle Antwort. Wenn ich das Programm laufen lassen kommt leider nie eine Fehlermeldung. Alles läuft fehlerfrei durch nur am Ende wird kein Bild im Browser angezeigt.

Ich habe mich zwar an die Vorgaben aus dem Tutorial gehalten aber vielleicht liegt es daran das beim speichern des Bildes in der Datenbank ein Fehler gemacht wurde.

Hier ist mein Quellcode Teil1. Am Ende von diesem Script wird die Datei data_get aufgerufen die dann das Bild ausgeben soll.


/* data_save */

/* Ab hier wird mit dem Speichern des Bildes in der DB begonnen */

...			   

$blob = OCINewDescriptor ($oraSession,OCI_D_LOB);


$sql ="DECLARE

    iimage ordsys.ordimage;

    iblob  BLOB;

        BEGIN

INSERT INTO TBL_PICTURE (TITEL,FNAME,FHEIGHT,FWIDTH,FSIZE,FTYPE,PICTURE)

VALUES ('$titel','$fname','$fheight','$fwidth','$fsize','$ftype',					ordsys.ordimage(ordsys.ordsource(EMPTY_BLOB(),

					NULL, NULL, NULL, SYSDATE, 1),

					NULL, NULL, NULL, NULL, NULL,	NULL, NULL)

					);

SELECT PICTURE INTO iimage FROM TBL_PICTURE WHERE TITEL = '$titel' FOR UPDATE;

			iblob    := iimage.source.localData;

			:extblob := iblob;

					END;"; 


$sql = strtr($sql,chr(13).chr(10)," ");


$oraParse=oci_parse($oraSession,$sql);

			oci_bind_by_name($oraParse,':extblob',&$blob,-1,OCI_B_BLOB);

oci_execute($oraParse,OCI_DEFAULT);

$blob->save($fname);

oci_free_statement($oraParse);


ocifreedesc($blob);


/* Gültigkeitsprüfung der eingefügten Daten */ 

$sql=" DECLARE

	      iImage	ORDSys.ORDImage;

	BEGIN

	SELECT PICTURE INTO iImage FROM TBL_PICTURE

	WHERE TITEL = '$titel FOR UPDATE;


	     iImage.process('scale=1');

	     iImage.setproperties;


	UPDATE TBL_PICTURE SET PICTURE=iImage WHERE TITEL = '$titel';

	END;";        			


$sql = strtr ($ql,chr(13).chr(10)," ");

$oraParse=oci_parse($oraSession,$sql);


if (@OCIExecute ($oraParse,OCI_DEFAULT)) { 

?>

<script type="text/javascript">

	alert("Bild erfolgreich hochgeladen!");

</script>

<?

oci_commit($oraSession);

}

else {

?>

<script type="text/javascript">

      alert("Unbekanntes Bildformat!");

</script>

<?

oci_rollback($oraSession);

}	

oci_free_statement($oraParse);

}

}

	?>

	<script type="text/javascript">

	parent.funktion.location.href="head_add.php<?echo $send?>";

	document.location.href ="data_list.php<?echo $send?>";

	</script>

	<?php

}

/*____________________________________________________________________

JavaScript zum Abschicken des Formulars 'input'

_____________________________________________________________________*/

?>

<script type="text/javascript" src="../javascript/_load_javascript_edit_picture_form.js"></script>

<?php


/*____________________________________________________________________

content_data()

Seiteninhalt --> Formular zum Anlegen eines neuen Bildes und zum

                 Bearbeiten von vorhandenen Bildern

_____________________________________________________________________*/

function content_data() {


	require("../require/require_dbconnect.php");  


	global $send;


	if ($_GET["id"]!=0) {


	$id = $_GET["id"];


	$cur = oci_new_cursor($oraSession);


	$sql = oci_parse($oraSession, "begin getPictureList.get_picture(:bind1,:getpicture_cv); end;");  


	oci_bind_by_name($sql, ":bind1", $id,32);

  	oci_bind_by_name($sql, ":getpicture_cv",&$cur,-1,OCI_B_CURSOR);


	oci_execute($sql);

	oci_execute($cur);


	ocifetchinto($cur,&$getpicture_cv);


	$picid = $getpicture_cv[0];


	$folder = $getpicture_cv[2];

	$fname = $getpicture_cv[3];

	$fheight = $getpicture_cv[4];

     $fwidth = $getpicture_cv[5];

     $fsize = $getpicture_cv[6];

     $ftype = $getpicture_cv[7];

     $fformat = $getpicture_cv[8];

     $date_new = $getpicture_cv[9];

 }


?>

<form name="input" action="<? $self ?>?action=upload" method="post" enctype="multipart/form-data" onSubmit="return check()">

	<table id="sub-table" width=650 cellpadding="0" cellspacing="0" border="0">

    <tr><td> </td></tr>

    <tr>

    	<td width=150 height="30">Arbeitstitel</td>

    	<td width=500 height="30">

    		<input id="formbutton" type="text" name="arbeitstitel" value="<? echo $titel?>">

    	</td>

    </tr>

    <tr>

    	<td width=150 height="30">Ordner</td>

     <td width=500 height="30">

  	<select name="range" size="1" id="formbutton">

	  <option id="formbutton"></option>

	    <?

		require("../require/require_dbconnect.php");

		$cur = oci_new_cursor($oraSession);


$sql = oci_parse($oraSession, "begin getFolderList.list_folder(:listfolder_cv); end;");

	oci_bind_by_name($sql, ":listfolder_cv",&$cur,-1,OCI_B_CURSOR);


	oci_execute($sql);

	oci_execute($cur);


	while (ocifetchinto($cur,&$listfolder_cv)) {

 		$folderid = $listfolder_cv[0];

		$ordner = $listfolder_cv[1];

	?>

	<option id="formbutton" name="auswahl" value="<? echo $folderid?>"><? echo $ordner?></option>

	<?

	}

	?>

		</select>

      </td>

    </tr>

		<tr>

      <td width=150 height="30">Bilddatei</td>

      <td width=500 height="30">

    		<input type="hidden" name="MAX_FILES_SIZE" value="38000">

    		<input id="formbutton" type="file" name="datei"><br />

        	<input type="hidden" name="id" value="<?echo $_GET["id"]?>">

        	<input type="hidden" name="sid" value="<?echo $_GET["sid"]?>">

        	<input type="hidden" name="filename" value="<?echo $fname?>">

        	<input type="hidden" name="filesize" value="<?echo $fsize?>">

		<input type="hidden" name="fileheight" value="<?echo $fheight?>">

		<input type="hidden" name="filewidth" value="<?echo $fwidth?>">

	     <input type="hidden" name="filetype" value="<?echo $ftype?>">

    		<input type="hidden" name="action" value="update">

    	</td>

    </tr>


	<?php

          if ($fname!=""){

	?>


    <tr >

      <td width="150" height="24">Original Name<br /> der Bilddatei</td>

      <td height="24"><? echo $fname;?>

      </td>

    </tr>

    <tr>

      <td width="150"> </td>

      <td width="500">

        <img src="data_get.php?id=<?echo $_GET["id"];?>" width="20%">

      </td>

    </tr>

...

Teil2

$oraSession = OCILogon("scott","tiger","oracleDB") or die("Es konnte keine Verbindung zur Datenbank hergestellt werden!");

$sSessionid = $_GET["id"];

session_cache_limiter("nocache");

$sMimetag = "";


$blob = OCINewDescriptor ($oraSession,OCI_D_LOB);

$stmt = " DECLARE

		sMimeTag VARCHAR2(10);

	    BEGIN

		:extblob:=GetPicture($sSessionid,'224');

		:sMimetag:=sMimeTag;

	END; ";


$stmt = strtr ($stmt,chr(13).chr(10)," ");

$oraParse=OCIParse($oraSession,$stmt);

OCIBindByName ($oraParse,':extblob',&$blob,-1,OCI_B_BLOB);

OCIBindByName ($oraParse,':sMimetag',&$sMimetag,10);

OCIExecute ($oraParse,OCI_DEFAULT);

$BinaryBild = $blob->load();

OCIFreeStatement ($oraParse);

OCICommit ($oraSession);

OCILogOff ($oraSession);


header ("Content-Type: ".$sMimetag);

echo $BinaryBild;

Die Funktion getPicture hab ich vom Tutorial übernommen.

Kennst du vielleicht auch eine gute Seite in der das Speichern und Anzeigen von Bildern im Browser gut beschrieben ist?

Vielen Dank,Christian

Link zu diesem Kommentar
Auf anderen Seiten teilen

if ([B][COLOR="Red"]@[/COLOR][/B]OCIExecute ($oraParse,OCI_DEFAULT)) { 

kannst du bitte mal das @ wegnehmen und nochmals ein bild raufladen.

das @ unterdrückt nämlich seitens php allfällige fehlermeldungen.

weiters würde ich verifizieren, ob im feld PICTURE wirklich daten vorhanden sind. nimm ein tool, das dir die daten anzeigt, z.b. toad oder den enterprise manager. du kannst dort z.b. auch ein sql-statement absetzen, das dir mit LENGTH die grösse der rohen bilddaten ausgibt o.ä.

s'Amstel

Link zu diesem Kommentar
Auf anderen Seiten teilen

Habe anstatt den TOAD mit dem PL/SQL Developer geschaut ob ein Bild in der Datenbank gespeichert ist. NEIN, kein Bild. Dank deinem Tipp weiß ich jetzt wenigstens das der Fehler nicht an der Ausgabe liegt. Weißt du wo der Fehler liegen könnte beim speichern des Bildes? Der Quellcode ist immer noch genause wie in meinem letzten Beitrag.

zum @ Zeichen:

habe das @ Zeichen weggemacht aber da kamen keine Fehlermeldungen und das Ergebnis ist nach wie vor das gleiche, kein Bild. Aber der Tipp war trotzdem gut,jetzt weiß ich wenigstens mal wofür das @ Zeichen in PHP steht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

ich kann dir nur anbieten, wenn ich mal zeit habe, das script bei mir auszuprobieren ... muss aber erst schauen, ob ich intermedia zum laufen bekomme, und das wird sicher nicht vor ende jänner sein.

versuche aber mal, zumindest $sql und $cur mit "echo" zu versehen, und poste die ausgabezeilen mal hier ... es könnte z.b. auch daran liegen, dass standardmässig zu wenige freie cursor zur verfügung stehen (das kann auch stillschweigend ohne fehlermeldungen passieren)

noch ein lösungsvorschlag wäre, dass du die session mit "trace" verfolgst und die resultierenden tracefiles begutachtest und noch einen blick auch das alert_log wirfst.

mehr wüsste ich jetzt aus dem stegreif auch nicht. :floet:

s'Amstel

Link zu diesem Kommentar
Auf anderen Seiten teilen

habe jetzt eine PHP Fehlermeldung:


ociexecute() [function.ociexecute]: ORA-29400: Data Cartridge-Fehler IMG-00705: Eingabeformat wird nicht unterstützt oder ist fehlerhaft 

ORA-06512: in "ORDSYS.ORDIMERRORCODES", Zeile 0 

ORA-06512: in "ORDSYS.ORDIMG_PKG", Zeile 115 

ORA-06512: in "ORDSYS.ORDIMG_PKG", Zeile 447 

ORA-06512: in "ORDSYS.ORDIMAGE", Zeile 53 

ORA-06512: in Zeile 10 in C:\Programme\xampp\htdocs\mycms\einfuegen.php on line 83

kannst du damit was anfangen? Das Format des Bildes war .jpg. Habe aber nicht nur ein Bild sondern verschiedene Bilder ausprobiert, auch andere Formate.

Link zu diesem Kommentar
Auf anderen Seiten teilen

ORA-29400: Data Cartridge-Fehler IMG-00705: Eingabeformat wird nicht unterstützt oder ist fehlerhaft

juhu, sowas aussagekräftiges wollte ich :D

welche formate hast du versucht? TIFF, JPG, GIF, PNG?

welches format hat dein JPG - ist das RGB oder CMYK?

mach mal bitte ein "select * from v$version" damit ich die version sehe.

s'Amstel

Link zu diesem Kommentar
Auf anderen Seiten teilen

habe png und jpg probiert. das jpg bild ist rgb!


SQL> select * from v$version;


BANNER

----------------------------------------------------------------

Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production

PL/SQL Release 9.2.0.1.0 - Production

CORE	9.2.0.1.0	Production


TNS for 32-bit Windows: Version 9.2.0.1.0 - Production

NLSRTL Version 9.2.0.1.0 - Production

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...