Webviewer - Starthilfe



  • Hallo,

    Ich schreib nebenher gerade an einem kleinen Image/Webviewer. Der soll Bilder aus einer Datenbank einlesen und auf dem jeweiligen Client - Rechner darstellen.
    Ich bin mittlerweile soweit, die Bilder bzw. Previews aus der Datenbank zu laden und kriege sie lokal gespeichert:

    $count++;
    	    while($thumb_row = my_odbc_fetch_array($query_thumb))
    	    {
    
    			//Saving temporary images and store them local
    			$tmp_img ="./tmpThmbs/thmb".$count.".jpg";
    			$fp = fopen ( $tmp_img , "rbw" );
    			fwrite($fp, $thumb_row['Thumbnail'] );
    			fclose( $fp );
    			echo "<img src=\"", $tmp_img, "\" width=128 height = 100 border=0 alt=".$row['Bildtyp'].">"}
    ;
    

    Giebt das so nicht Ärger, wenn mehrere Anfragen laufen? Das ganze steckt schließlich in 'ner Schleife, die durch die DB läuft. Ich müßte doch also eigentlich dafür sorgen, das die Dateien nicht lokal auf dem Server sondern auf dem aufrufenden Client - Rechner erzeugt werden, oder?
    Ich hab bereits versucht mittels:

    rewind($fp);
       			$strHead = "Content-type: image/jpeg\nContent-Disposition: inline; filename=\"".$g_tmp_img."\"\nContent-length: ".(string)(filesize($g_tmp_img));
       			header( $strHead );
    			print $strHead;
    			$bPassed = fpassthru ($fp);
    			assert( $bPassed != 0 );
    			fclose( $fp );
    

    das etwas anders zu lösen, aber irgendwie kommen dann auf der anderen Seite im Browser die JPegs als ASCII - Zeichen an.

    Eigentlich alles in allem 'ne simple Aufgabe, aber für jemanden wie mich, der sich bisher nie mit Webzeugs beschäftigt hat schon eine richtige Herausforderung.

    Danke für eure Hilfe und Euer Verständnis für meinen bescheidenen Wissensstand



  • Trenne mal deine einzelnen Header in mehrere Aufrufe auf, oder versuche es mit \r\n statt \n. Ansonsten: Warum erzeugst du eine temporäre Datei und schickst due Daten nicht direkt 😕



  • Du meinst so:

    $fp = fopen ( "C:\\apachefriends\\xampp\\htdocs\\tmpThmbs\\tmp.jpg", "rb" );
    header( "Content-type: image/jpeg" );
    $bPassed = fpassthru ($fp);
    fclose( $fp );
    

    Hab extra mal nicht aus der DB geladen, sondern nehme ein File, was auf der Platte liegt. Trotzdem wird nichts angezeigt -> ASCII - Zeichen.



  • Du hast mich nicht ganz richtig verstanden. Der erste Teil sollte die eigentliche Antwort sein:

    Trenne mal deine einzelnen Header in mehrere Aufrufe auf, oder versuche es mit \r\n statt \n.

    Der zweite Teil war nur als Anmerkung gedacht, da ich mich wunderte, warum du, wenn du die Daten schon in der DB speicherst und sie per Script an den Client sendest, warum du dann die Daten erst in eine temporäre Datei schreibst 🙄



  • Man bist du fix:

    Ich hab das jetzt versucht mit \r\n -> das Ergebnis bleibt das gleiche. Sorry für die blöde Frage -> Header Teilen würde also heißen:

    header( "Content-type: image/jpeg" );
    header( "Content-Disposition: inline; filename=\"".g\_tmp\_img."\\"" ); header( "Content-length: ".(string)(filesize(g_tmp_img)) );

    hab ich so auch versucht -> gleiches Ergebnis.

    Warum erzeugst du eine temporäre Datei und schickst due Daten nicht direkt

    In $thumb_row['Thumbnail'] steckt ein Jpeg - Stream. Kein Dateipfad. Kann ich den denn direkt anzeigen? Nichts wäre mir lieber als das.

    erstmal Danke für die schnelle Hilfe



  • Also entweder du legst eine Datei auf dem Server ab, und gibst im IMG-Tag direkt die entsprechende URL an, oder du machst es eben so, dass du im IMG-Tag ein php-Script angibst, welches dann die entsprechenden Header sendet - gefolgt von den Stream-Daten (was allerdings nicht so geschickt ist, da PHP mehr arbeiten muss). Eigentlich sollte man meist größere Datenmengen (wie die Bilddaten) eh eher nicht direkt in der DB speichern, sondern nur einen Pfad (und die Daten in einer Datei)



  • Ich bin beim rumspielen auf was (zumindest für mich) merkwürdiges gestoßen

    gebe ich die Bilder mit

    $fp = fopen( $g_tmp_img, "rwb" );
    fwrite($fp, $thumb_row['Thumbnail'] );
    fclose( $fp );
    $im = @imagecreatefromjpeg( $g_tmp_img );
    ImageJPEG( $im );
    ImageDestroy( $im );
    

    aus ist alles wunderbar. Sobald ich aber schon ein echo "<hr />"; nach jedem Bild mache, bzw. überhaupt irgedndwas mit echo in der Schleife ausgebe funktioniert die Bildausgabe nicht mehr 😕 .
    Ich denke mir fehlt da im Moment das grundlegende Verständnis.

    du legst eine Datei auf dem Server ab, und gibst im IMG-Tag direkt die entsprechende URL

    Die Variante ist bisher die einzige, die funktioniert. Was passiert dann eigentlich, wenn mehrere Scripte auf ein und die selbe Datei zugreifen (eines liest, das andere schreibt). Giebt es da keinen Ärger? Solche Anfragen werden doch sicher parallel verarbeitet.

    Eigentlich sollte man meist größere Datenmengen (wie die Bilddaten) eh eher nicht direkt in der DB speichern, sondern nur einen Pfad (und die Daten in einer Datei)
    

    Die Db war so nicht meine Idee, aber ich muß wohl damit leben :). Das sind nur die Thmbnails. Viel schlimmer ist, das die wirklichen Bilder tiffs sind, die ich vorher vermutlich mit 'nem kleine Java - Applet konvertieren muß, oder giebt es dafür 'ne schicke php - library. In Java ging das eigentlich ganz gut.

    Vielen Dank für Deine Geduld mit 'nem Web - Dilletanten wie mir 🙂



  • TheBigW schrieb:

    Was passiert dann eigentlich, wenn mehrere Scripte auf ein und die selbe Datei zugreifen (eines liest, das andere schreibt). Giebt es da keinen Ärger? Solche Anfragen werden doch sicher parallel verarbeitet.

    Falls du keine Dual und mehr Prozessor-Rechner hast und nicht gerade mehr Festplatten dann kann immer nur einer auf die Datei zugreifen. Der Festplattenkopf kann nicht zur gleichen Zeit an verscheidenen Stellen (anfang und irgendwo anderes in der Datei) sein.
    Hat aber nichts mit deinem Problem zu tun.
    Mach dir mal keine Sorgen das nicht mehrere Webuser auf eine Datei zugreifen können und überlasse solche Zugriffe den BS-Programmierer. Die müssen sich um Thread und Zeitfenster kümmern.

    BLOB-Daten in einer DB kosten sehr viel. Deshalb: lege die Dateien als File ab und speichere nur den Link



  • Ich weiß halt zu wenig, wie ein so ein Webserver sowas überhaupt verarbeitet.

    Wenn ich z.B. in einer Multithreading Anwendung in mehreren Threads an ein und der selben Datei Arbeite, dann kann es doch durchaus passieren, das ein Thread gerade eine Datei modifiziert, die ich mit einem anderen Thread gerade einlese (wenn ich beim synchronisieren nicht aufpasse 🙂 ), oder irre ich da.

    Aber wenn du mir sagst, das ich mich drauf verlassen kann, dann wirds schon stimmen.

    BLOB-Daten in einer DB kosten sehr viel. Deshalb: lege die Dateien als File >ab und speichere nur den Link

    Ist mir klar. Wie gesagt, die DB kommt nicht von mir und es werde auch nur kleine Thmbnails darin abgelegt. So oder so ich muß damit leben. Das ganze ist auch nicht als Weblösung geplant, sonder eher als Firmen/Kliniksinterner Bildbetrachter.



  • TheBigW schrieb:

    Sobald ich aber schon ein echo "<hr />"; nach jedem Bild mache, bzw. überhaupt irgedndwas mit echo in der Schleife ausgebe funktioniert die Bildausgabe nicht mehr 😕

    Das ist ganz logisch - du scheint da wohl noch etwas Verständnisprobleme bzgl. HTML zu haben 😉
    Bilder musst du immer per img-Tag einbinden, nie direkt die Bilddaten in der HTML-Seite ausgeben. als src kannst du dann im img-Tag entweder direkt die URL des Bildes angeben, oder eben ein Script, welches dann den Stream sendet 🙂



  • Danke, zumindest das ist mir jetzt klar. Aber ruckzuck das nächste Problem:

    Ich gebe jetzt die Thumbnails aus und will das Bild gleich als Link zu dem "richtigen" Bild benutzen. Leider funktioniert das:

    echo "<a href='".$HighResImgLink."' target='_blank'><img src='".$ThmbImage."' width=128 height=100 border=0 alt=".$ImgType."></a>";
    

    nur im IE und nicht im Mozilla. In $HighResImgLink steht der Pfad zum jeweilige Bild z.B.:

    file://///RSC015/D/Archive/4940O773_Vol1/Archive 4940O773/d00/d00/d00/Archive 4940O773 f00000002.jpg

    kopiere ich das ganze in die Adressleiste funzt es auch wunderbar. der Link wird unten in der Statusleiste auch korrekt angezeigt nur leider verweigert er hartnäckig darauf zu reagieren.



  • Du darfst im Web keine lokalen Pfade verwenden ⚠



  • Uhhm, tja sowas häßliches hab ich mir doch fast gedacht. D.h. ich muß tatsächlich die Datei von dem Ort, an dem Sie in der Datenbank liegt umkopieren in den Ordner meiner Page, um dann mittels URL darauf zugreifen zu können?
    Das wird ein ganz schönes Rumgewusel, da manche Bilder ganz schön groß sind.

    Auf die Idee mit den lokalen Pfaden wäre ich auch nicht gekommen, aber da das ganze ja keine wirkliche Web - Lösung werden soll wäre es halt sehr bequem/schnell gewesen, das einfach so umzusetzen.

    Das weitere Procedere wäre also, beim Klick auf das Thmbnail - Image ein Weiteres php - Script aufzurufen, was dann die Umkopiererei macht.



  • Entweder du überträgst die Daten eben direkt per Script, oder eben temporäre Datei, die du normal verlinkst 😉



  • Vielen Dank,

    durch Deine Hilfe ist das ganze schon ein gutes Stück vorangekommen. Das Anzeigen der Bilder übernimmt jetzt mein Java - Applet, da sowieso ein paar kleine Bildverarbeitungsfunktiönchen und zoomen der Bilder möglich sein sollte. Das Applet versteht ja auch lokale Pfade -> also bin ich erstmal fein raus :).



  • TheBigW schrieb:

    Das Applet versteht ja auch lokale Pfade -> also bin ich erstmal fein raus :).

    Wenn das Applet nachher auf dem Client läuft, kann es eigentlich auch keinen lokalen Server-Pfade verstehen 🙄


Anmelden zum Antworten