Dynamische Dateinamen-Ausnahme für Mod Rewrite

Gesperrt
TripleM
Beiträge: 42
Registriert: Sa 5. Mär 2005, 12:13
Kontaktdaten:

Dynamische Dateinamen-Ausnahme für Mod Rewrite

Beitrag von TripleM »

Hallöchen,

ich hätte da mal eine Frage an jemanden, der sich mir der Mod Rewrite und .htaccess auskennt. Vielleicht kann mir ja jemand netterweise helfen. Mein Problem ist, daß ich beim Suchen nichts Passenden gefunden habe, und ehrlich, 51 Seiten Thread auf gut Glück durchlesen (so lang ist der längste mod rewrite Thread) ist der Horror!

Folgendes Szenario: wenn bei mir jemand in einem Artikel von Contenido auf einen Link klickt (generateXML.php?folder=$folder) dann soll in dem auf diese Weise angegebenen Verzeichnis=$folder eine XML-Datei angelegt werden, mit daten, die von dem Artikel zuvor ausgelesen wurden.

[Konkret geht es hierbei um die Generierung einer XML-Datei die die Bilder aus einem zuvor in einem Modul ausgewählten Verzeichnis ausgelesenen und von der PHP-Datei ausgegebenen dateinamen derselbigen abspeichert, um nachher für eine SWF-Bildergalerie sozusagen als Datenquelle zu dienen. Außerdem um die automatische Generierung von Thumbnails einer speziellen Größe und Art (müssen transparente PNGs sein.)

Logik: Benutzer wählt in Artikel-Konfiguration Verzeichnis für Bildergalerie aus = normale Bildergalerie. Klickt er dann noch in seinem Artikel auf den Link zu der PHP-Datei
- werden transparente PNGs im Ordner $folder/bilder/thumbs generiert und
- es wird eine XML-Datei generiert, aus der sich dann eine SWF die Bildernamen holt, einmal $folder/bilder für die großen, und einmal $folder/bilder/thumbs für die Thumbnails.

Ich hoffe ich habe das einigermaßen verständlich erklären können?]

Das hat auch bisher ganz gut geklappt gehabt - nun habe ich im Contenido 4.8.8 das dazugehörige Mod Rewrite installiert und habe Probleme mit dieser Funktionsweise.

Ich habe es jetzt geschafft durch die Zeilen

Code: Alles auswählen

RewriteRule ^cms/generateXML.php.*$ - [L] 
RewriteRule ^cms/Gallery.swf.*$ - [L] 
(gefunden hier im Forum) diese beiden Dateien tatsächlich aufrufbar zu machen.

Wie aber nehme ich Dateien in wechselnden Unterordnern automatisiert in der .htacces vom Mod Rewrite aus? Da durch die Veränderung des $folder-Parameters die generierten Thumbnails und die XML-Datei immer in ein anderes Unterverzeichnis von upload/ geschrieben werden müssen müßte ich der .htaccess diese auch wechselnd mitgeben - oder geht das mit irgendeiner Form der Wildcard?

Ansonsten kommen bei mir jetzt immer diese Fehlermeldungen (resultierend aus dem Versuch der PHP-Datei Ordner zu lesen die es nicht gibt, Thumbnails aus nicht vorhandenen Bildern in nicht vorhandene Ordner zu schreiben und dann auch noch deren nicht vorhandene Dateinamen in eine XML-Datei in einem Verzeichnis zu schreiben, das nicht existiert - HEEEUL!):

Code: Alles auswählen

<b>Warning</b>:  opendir(http://DOMAIN.de/cms/upload/gallery/FOLDER/bilder) [<a href='function.opendir'>function.opendir</a>]: failed to open dir: not implemented in <b>/www/htdocs/.../cms/generateXML.php</b> on line <b>11</b><br />
<br />
<b>Warning</b>:  readdir(): supplied argument is not a valid Directory resource in <b>/www/htdocs/.../cms/generateXML.php</b> on line <b>12</b><br />

<br />
<b>Warning</b>:  opendir(http://DOMAIN.de/cms/upload/gallery/FOLDER/bilder) [<a href='function.opendir'>function.opendir</a>]: failed to open dir: not implemented in <b>/www/htdocs/.../cms/generateXML.php</b> on line <b>66</b><br />
<br />
<b>Warning</b>:  readdir(): supplied argument is not a valid Directory resource in <b>/www/htdocs/.../cms/generateXML.php</b> on line <b>70</b><br />

<br />
<b>Warning</b>:  closedir(): supplied argument is not a valid Directory resource in <b>/www/htdocs/.../cms/generateXML.php</b> on line <b>78</b><br />
<br />
<b>Warning</b>:  fopen(http://DOMAIN.de/cms/upload/gallery/FOLDER/images.xml) [<a href='function.fopen'>function.fopen</a>]: failed to open stream: HTTP wrapper does not support writeable connections in <b>/www/htdocs/.../cms/generateXML.php</b> on line <b>84</b><br />

<br />
<b>Warning</b>:  fwrite(): supplied argument is not a valid stream resource in <b>/www/htdocs/.../cms/generateXML.php</b> on line <b>85</b><br />
<br />
<b>Warning</b>:  fclose(): supplied argument is not a valid stream resource in <b>/www/htdocs/.../cms/generateXML.php</b> on line <b>86</b><br />
<br />

<b>Warning</b>:  filesize() [<a href='function.filesize'>function.filesize</a>]: stat failed for http://DOMAIN.de/cms/upload/gallery/FOLDER/images.xml in <b>/www/htdocs/.../cms/generateXML.php</b> on line <b>89</b><br />
<br />
<b>Warning</b>:  fread() [<a href='function.fread'>function.fread</a>]: Length parameter must be greater than 0 in <b>/www/htdocs/.../cms/generateXML.php</b> on line <b>89</b><br />
Wenn mir da irgendjemand weiterhelfen könnte wäre das Gaaaaanz große Klasse!

DANKE!
xmurrix
Beiträge: 3213
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Hat sich bedankt: 4 Mal
Danksagung erhalten: 16 Mal
Kontaktdaten:

Re: Dynamische Dateinamen-Ausnahme für Mod Rewrite

Beitrag von xmurrix »

Hallo TripleM,

wenn ich das richtig verstanden habe, ist die Struktur folgendermaßen:
- Gallery.swf gibt es einmal unter "cms/"
- generateXML.php gibt es auch einmal unter "cms/"
- *.xml kommt in unterschiedliche Ordner im upload-Verzeichnis

Wo liegt die $folder/bilder/thumbs, unter "cms/"?

Die zwei RewriteRules sorgen dafür, dass die beiden Files aus der Verarbeitung ausgeschlossen werden.

Code: Alles auswählen

RewriteRule ^cms/generateXML.php.*$ - [L] 
RewriteRule ^cms/Gallery.swf.*$ - [L] 
Das ist ok so.

Normalerweise ist alles, was im Ordner upload liegt, auch ausgeschlossen, das macht die Zeile

Code: Alles auswählen

RewriteRule ^cms/upload/.*$ - [L]
Willst du auch Ordner nach dem Muster "$folder/bilder" und "$folder/bilder/thumbs" auch ausschließen, sollte es mit folgenden Regeln gehen:

Code: Alles auswählen

RewriteRule ^.*bilder/.*$ - [L] # oder auch ^.*cms/bilder/.*$
RewriteRule ^.*bilder/thumbs/.*$ - [L] # oder auch ^.*cms/bilder/thumbs/.*$
Auch mit der letzten Zeile in der .htaccess lässt sich das Regeln. Die wird zum Schluss verarbeitet, wenn die vorherigen Regeln nicht greifen. Dort steht:

Code: Alles auswählen

RewriteRule !\.(js|ico|gif|jpg|jpeg|png|css|pdf)$ front_content.php [NC,QSA,L]
Bedeutet: Alles, was nicht die Dateieendung js, ico, gif, jpg, jpeg, png, css, pdf hat, soll an die front_content.php übergeben werden.

Ich vermute, dass dein Problem aber ein Anderes ist. und nicht am Mod Rewrite liegt.

Code: Alles auswählen

opendir(http://DOMAIN.de/cms/upload/gallery/FOLDER/bilder)
Man sollte nicht unbeding eine Datei über http öffnen, und dieses Feature wird auch bei den meisten Providern deaktiviert. Ich würde die generateXML.php Zeile 11 anpassen. Du kannt auch mal das AMR Plugin deaktivieren, um die Funktionaliät ohne das Plugin zu testen.

Gruß
xmurrix
TripleM
Beiträge: 42
Registriert: Sa 5. Mär 2005, 12:13
Kontaktdaten:

Mod Rewrite in $folder deaktivieren?

Beitrag von TripleM »

Ok, den oberen Ausführungen kann ich folgen, deine Analyse war perfekt.

Und ich denke sogar Du hast mit der letzten Einschätzung recht: das hatte ich nicht bedacht. Bei deaktiviertem Mod Rewrite funktioniert die PHP-Datei auch wieder, denn:

Der Anfang der generateXML.php lautet

Code: Alles auswählen

if (isset($_GET['folder'])) {
    $folder = $_GET['folder'];
}

$ordner = $folder . "bilder";
$handle = opendir($ordner);
Und da die übergebene Variable $folder so im aufrufenden Modul erzeugt wurde:

Code: Alles auswählen

$folder= "upload/"."CMS_VALUE[0]"; 
hat das bis zum ModRewrite funktioniert, da war das nämlich auch ein relativer Pfad, is ja klar. Aber sobald Mod rewrite aktiviert ist schreibt er die Variable $folder um und macht automatisch http://DOMAIN.de/cms/upload/gallery/FOLDER/ draus.

Wie kann ich also Mod Rewrite dazu bringen daß er von dieser Variablen in diesem Modul die Finger läßt?
xmurrix
Beiträge: 3213
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Hat sich bedankt: 4 Mal
Danksagung erhalten: 16 Mal
Kontaktdaten:

Re: Mod Rewrite in $folder deaktivieren?

Beitrag von xmurrix »

TripleM hat geschrieben:...

Code: Alles auswählen

if (isset($_GET['folder'])) {
    $folder = $_GET['folder'];
}

$ordner = $folder . "bilder";
$handle = opendir($ordner);
Und da die übergebene Variable $folder so im aufrufenden Modul erzeugt wurde:

Code: Alles auswählen

$folder= "upload/"."CMS_VALUE[0]"; 
...
Damit in der generateXML.php ankommende Parameter verarbeitet werden können, muss die Datei, z. B. mit /generateXML.php?folder=foobar aufgerufen werden.

Wie sieht die URL zur generateXML.php aus, wenn du das Plugin deaktivierst und kannst du auch den Modulcode posten, in der diese URL erstellt wird?

Falls die URL ohne decodieren der Parameter erstellt wird, könnte sich die .htaccess daran stören (mit generateXML.php?folder=upload/foobar könnte es Probleme geben, richtiger wäre generateXML.php?folder=upload%2Ffoobar). Beispiel:

Code: Alles auswählen

$folder = 'upload/foobar';
$folder = urlencode($folder);
$url = 'generateXML.php?folder=' . $folder;
echo $folder;
Gruß
xmurrix
TripleM
Beiträge: 42
Registriert: Sa 5. Mär 2005, 12:13
Kontaktdaten:

Hier der Code

Beitrag von TripleM »

Ich habe mir das Modul aus anderen vorhandenen Modulen zusammengebastelt.

Ich hoffe die folgende Info beantwortet Deine Frage; die Variable $folder wird folgendermaßen erzeugt:

im Input des Moduls wählt der Benutzer den Ordner mit den Bildern drin aus.

Code: Alles auswählen

 $sql = "SELECT DISTINCT dirname FROM ".$cfg['tab']['upl']." ORDER BY dirname";
  $db->query($sql);
  echo '<table><tr><td>'.mi18n("Verzeichnis ausw&auml;hlen").'</td><td>
        <select name="CMS_VAR[0]" size="1" style="width: 320px">
            <option value="">'.mi18n("Nichts ausgew&auml;hlt").'</option>';
            while ($db->next_record()) {
                if ( stristr($db->f("dirname"),'CVS/') === FALSE ) {
                    if ($db->f("dirname")=="CMS_VALUE[0]") {
                        echo '<option value="'.$db->f("dirname").'" selected="selected">'.$db->f("dirname").'</option>';
                    } else {
                        echo '<option value="'.$db->f("dirname").'">'.$db->f("dirname").'</option>';
                    }
                }
            }
    echo '</select></td></tr></table>';
Diese Eingabe wird im Output wie folgt weiterverarbeitet (gekürzt bis aufs Wesentliche):

Code: Alles auswählen

<?php 
if ("CMS_VALUE[0]" == "") $folder="upload/gallery/Standardgalerie/";
else $folder= "upload/"."CMS_VALUE[0]"; 

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
  codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="800" height="400" id="flashmovie">
  <param name="movie" value="Gallery.swf?folder=<?php echo $folder; ?>" />
  <param name="wmode" value="window" />
  <param name="loop" value="true" />
  <param name="menu" value="false" />
</object>

<div id="generateGallery"><a href="<?php echo 'generateXML.php?folder=' . $folder; ?>" title="Galerie aktualisieren"><img src="upload/layout/gallery.gif" alt ="" /></a></div>
Dieser angezeigte Link zur generateXML.php dient dem Benutzer dazu nach dem Aktualisieren von Bildern in den von mir voreingerichteten Galerien die XML-Datei, die die Namen der Bilder an das Flashmovie liefern, zu aktualisieren und Thumbails der Bilder zu erzeugen. Ich weiß, das ist bestimmt keine besonders elegante Lösung, aber in Ermangelung von Programmierkentnissen werde ich damit wohl leben müssen und bis zur Mod Rewrite hatte es auch eigentlich ganz gut funktioniert....

So, genug entschuldigt, zuletzt der relevante Code der generateXML.php:

Code: Alles auswählen

<?

if (isset($_GET['folder'])) {
    $folder = $_GET['folder'];
}


/*************************  Thumbs generieren ********************************/

$ordner = $folder . "bilder";
$handle = opendir($ordner);
while ($file = readdir ($handle)) {
    if(substr($file, -3)=="jpg") {
            $compl = $ordner."/".$file;
$bild=$folder."bilder/".$file;
$size=getimagesize($bild);
             $breite=$size[0];
             $hoehe=$size[1];
			 
	if	($hoehe>$breite) {
				$neueHoehe=100; 
			    $neueBreite=intval($breite*($neueHoehe/$hoehe));
                $altesBild=ImageCreateFromJPEG($bild);
                // $neuesBild=imagecreatetruecolor($neueBreite,$neueHoehe);
                // imagecopyresampled($neuesBild,$altesBild,0,0,0,0,$neueBreite,$neueHoehe,$breite,$hoehe);
                // ImageJPEG($neuesBild,$folder."bilder/thumbs/".$file);
				}
				else {
				$neueBreite=100;
				$neueHoehe=intval($hoehe*($neueBreite/$breite));
                $altesBild=ImageCreateFromJPEG($bild);
                // $neuesBild=imagecreatetruecolor($neueBreite,$neueHoehe);
                // imagecopyresampled($neuesBild,$altesBild,0,0,0,0,$neueBreite,$neueHoehe,$breite,$hoehe);
                // ImageJPEG($neuesBild,$folder."bilder/thumbs/".$file);
				}
				 
	//Bild erzeugen
	$img = imagecreatetruecolor(100, 100);
    imagesavealpha($img, true);
	$trans_colour = imagecolorallocatealpha($img, 0, 0, 0, 127);
    imagefill($img, 0, 0, $trans_colour);
	//Text schreiben
	$diffBreite = (100 - $neueBreite) / 2;
	$diffHoehe = (100 - $neueHoehe) / 2;
	imagecopyresampled($img,$altesBild,$diffBreite,$diffHoehe,0,0,$neueBreite,$neueHoehe,$breite,$hoehe);
	//PNG erzeugen
	$file = explode(".",$file);
	imagepng($img,$folder."bilder/thumbs/".$file[0].".png");
 
    }
}


/*************************  XML-Datei schreiben ********************************/

global $Text; 
$Text = '<gallery>';

$handle=opendir ($folder."bilder");

$i=1;

while ($datei = readdir ($handle)) {
	$thumb = explode(".",$datei);
if (substr($datei, -3)=="jpg")
 {$Text .= '<image thumb="'.$folder.'bilder/thumbs/'.$thumb[0].'.png" image="'.$folder.'bilder/'.$datei.'" resize="false"></image>';
$i++;}
}

closedir($handle);

$Text .= "</gallery>";

$Datei = $folder."images.xml";

$FilePointer = fopen($Datei, "w");
fwrite($FilePointer, $Text);
fclose($FilePointer);

$FilePointer = fopen($Datei, "r");
$Inhalt = fread($FilePointer, filesize($Datei));
fclose($FilePointer);

?>
Ok, bitte nicht zu laut drüber lachen, ich weiß, daß da viel Gebastel drin steckt und durch das Zusammenpappen mehrerer Codefragmente dürfte einiges überflüssigerweise doppelt und dreifach vorkommen - ich hoffe aber dadurch, daß es eh nur eine winzig kleine Seite ist, daß das die Performance nicht zu sehr beeinträchtigen wird.

Sagt Dir mein ganzes Bla bla jetzt überhaupt was?

Übrigens: danke für Deine Geduld und Dein Interesse!
xmurrix
Beiträge: 3213
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Hat sich bedankt: 4 Mal
Danksagung erhalten: 16 Mal
Kontaktdaten:

Re: Hier der Code

Beitrag von xmurrix »

Das Posten von deinem Modul (übrigens der Code ist doch in Ordnung und optimieren kann man da immer) war eine gute Idee, so konnte ich es besser nachvollziehen.

Das Problem liegt am AMR-Plugin, oder besser gesagt an der Fehlerkorrektur des Plugins wegen der falschen Basepath Interpretation des IE.

Damit URLs zu Bildern im Uploadverzeichnis vom IE korrekt interpretiert werden, sucht das Plugin nach URLs nach dem Schema "...upload/..." und stellt diesen URLs den HTML-Pfad des Client, z. B. http://domain/cms/upload voran.

Leider passiert dies auch bei deinem Modul, aus

Code: Alles auswählen

generateXML.php?folder=upload/bildergalerie/
macht das Plugin

Code: Alles auswählen

generateXML.php?folder=http://domain/cms/upload/bildergalerie/
und das ist in diesem Fall suboptimal.

Würde dir vorschlagen, im Moduloutput den Pfad zum Ordner mit urlencode() zu encodieren.

Code: Alles auswählen

<?php
if ("CMS_VALUE[0]" == "") $folder="upload/gallery/Standardgalerie/"; 
else $folder= "upload/"."CMS_VALUE[0]"; 
$folder = urlencode($folder);
...
dann werden URLs wie generateXML.php?folder=upload%2Fbildergalerie%2F generiert, die vom Plugin nicht geändert werden.

Gruß
xmurrix
TripleM
Beiträge: 42
Registriert: Sa 5. Mär 2005, 12:13
Kontaktdaten:

Vielen lieben Dank!

Beitrag von TripleM »

Ich werde das gleich heute Abend ausprobieren und dann morgen Bericht erstatten ob's geklappt hat - woran ich bei Deiner Kompetenz nicht zweifle ;-) Bisher ist mir in diesem Forum noch jedes mal echt super geholfen worden.

DANKE schonmal dafür!
TripleM
Beiträge: 42
Registriert: Sa 5. Mär 2005, 12:13
Kontaktdaten:

Hat funktioniert!

Beitrag von TripleM »

Super, vielen vielen Dank!
Gesperrt