Moin
Wenn sich die Möglichkeiten mit 2 Skripten nur auf die unten Beschriebene Methode mit den Inline-Bildern bezieht, kommt sie nicht in Frage, was bedeuten würde, ich hab im Moment keinerlei Perspektive mehr. :(((
Wenn Du noch andere Möglichkeiten weißt, gib' mir bitte noch nen Schups.
Also das mit den 2 Skripten geht eigentlich immer irgendwie. Hier ein allgemeines Beispiel (mit nur einem Skript)
<?php
$DIR="/tmp"; // Verzeichnis für temporäre Dateien, muss beschreibbar sein
$GEHEIM="irgendEinString"; // Ein kleines Geheimnis, wird später verwendet
if( !isset($ladeBild) ) {
// an dieser Stelle sollte das Skript dein externes Programm aufrufen und das machen, was sonst noch so nötig ist, um den HTML-Code drumherum auszugeben
// ich nehme jetzt einfach mal an, dass die Binärdaten des Bildes in $bild liegen
// Wir generieren uns einen temporären Dateinamen
$tname = tempnam($DIR, "foo"); // Siehe http://www.php.net/manual/en/function.tempnam.php
if(!$tname) die("kann keinen Namen für die temporäre Datei finden");
$fh = fopen($tname, "w");
if(!$fh) die("kann die temporäre Datei nicht zum schreiben öffnen");
if(!fwrite($fh, $bild)) die("kann nicht in die temporäre Datei schreiben");
fclose($fh);
// OK, wir haben jetzt die Bilddaten in einer temporären Datei und bereiten nun den erneuten Skriptaufruf vor
$imgsrc = $SCRIPT_NAME.'?ladeBild='.urlencode($tname).'&hash='.urlencode(md5($tname.$GEHEIM));
/* in $imgsrc hast du jetzt den nötigen Code für den zweiten Aufruf, zum Beispiel mit
echo '<img src="'.$imgsrc.'">';
Du kannst jetzt also deinen umgebenden HTML-Code mit diesem eingebetteten Bild ausgeben
*/
} else {
if(get_magic_quotes_gpc()) $ladeBild = stripslashes($ladeBild);
if(!md5($ladeBild.$GEHEIM) == $hash || !file_exists($ladeBild) ) {
header("HTTP/1.0 404 Not Found");
echo "Datei nicht gefunden"; exit();
}
$fh = fopen($ladeBild, "r");
if(!$fh) die("Datei konnte nicht zum lesen geöffnet werden");
header("Content-type: image/jpeg");
while (!feof($fh)) echo fread($fh, 1024);
fclose($fh);
unlink($ladeBild);
}
?>
So oder so ähnlich würde ich das machen.
Anmerkungen:
- Das klappt nur einmal, danach ist die Datei gelöscht, wenn also jemand das HTML-Dokument neu lädt, sollte er unbedingt auch den Prozess auf dem Server neu anstoßen (also evt. das Cachen des HTML-Dokuments verbieten).
- Wenn jemand mit Lynx surft oder Bilderladen abgestellt hat, sammeln sich mit der Zeit immer mehr temporäre Dateien an. Auf einem richtigen OS läuft zwar meist ein Cron-Job der das temp-Verzeichnis ab und zu aufräumt, aber du möchtest evt. noch selbst einen Garbage Collector einbauen, also alle auf diese Art generierten temporären Dateienamen irgendwo zentral sammeln und häufiger mal alte Dateien löschen.
- Wenn jemand $GEHEIM errät, oder eine Lücke in MD5 finden sollte, dann hast du verloren und er kann beliebige Dateien auf dem Server lesen. Gegenmaßnahmen verbleiben als Übung für den interessierten Leser.
- Der Code ist selbstverständlich ungetestet ;-)
Wenn du sowieso PHP-Sessions verwendest (oder das immer schonmal tun wolltest), bieten sich auch diese an: Du speicherst einfach den Wert von $bild in der Session und schon kümmert sich PHP um alle Probleme die bei der Eigenbau-Lösung auftauchen: Jeder User kriegt nur sein Bild zu sehen; wenn die Session abläuft, kümmert sich der GC um die Datenreste; es kann niemand Dateien sehen, die nicht vom Skript erzeugt wurden.
Als Kompromiss könnte man auch den Dateinamen der temporären Datei in der Session sichern.
Noch eine Alternative geht in Richtung Inline-Image: Wenn dein Bild sowieso nicht allzu groß ist, reicht vielleicht ein Skript in der Form von
<?php
header("Content-type: image/jpeg");
echo get_magic_quotes_gpc?$bilddaten:stripslashes($bilddaten);
?>
Nachteil: Die Bilddaten gehen 3mal über die Leitung -> Blöde Idee
Eine weitere Idee, wäre die bilderzeugende Aktion einfach mehrmals durchzuführen, so das überhaupt notwendig ist. Du gibst den HTML-Rahmen aus und gibst als Quelle für das Bild einfach nochmal das selbe oder ein ähnliches Skript an dem du alle Parameter die nötig sind, um das Bild zu erzeugen, mitgibst. Klappt natürlich nicht besonders gut, wenn diese Aktion mit irgendeinem Nebeneffekt verbunden ist oder 15 Sekunden Berechnungszeit benötigt.
Such dir dein Gift aus :-)
Es war ein hoffnungversprechender Ansatz, nur leider stört es mich ganz massiv, das der InternetExplorer zu den Browsern gehört, die die inlineBilder nicht Anzeigen können. Das ist nicht vertretbar.
Also ich find's sehr praktisch. Der IE läuft hier eh nicht. *g*
(vielleicht weißt Du das ja schon, und wolltest mich nicht unnötig verwirren)
Ich hatte überlegt ob ich das noch erwähnen soll, mich dann aber doch dagegen entschieden da es für diesen Fall wohl nicht besonders wichtig ist.
[snip]
Diese OutPut-Kontrolle arbeitet so, das ALLES was mit echo, print() oder an HTML gesendet wird, in dem Puffer landet, und NICHT an den Browser gesendet wird. WOHL ABER werden alle Header() und
setcookies() SOFORT an den Browser gesendet.
afaik werden auch die header nach wie vor gepuffert, denn man kann die zu sendenden HTTP-Header mit header() immernoch überschreiben.
[sehr viel nützliches, das jetzt im Archiv ist, gesnippt]
Ich find's klasse. :))
Jo, ich mag es zum Beispiel damit dynamisch ein Inhaltsverzeichnis der Seite zu erstellen und das anschliessend _vor_ dem eigentlichen HTML-Code auszugeben.
--
Henryk Plötz
Grüße von der Ostsee