php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Erweiterung einer Bildergalerie


 
picco
27-01-2007, 17:26 
 
Mir hat ein Kumpel vor einiger Zeit ein cript für eine Bildergalerie geschickt. Anfangs funktionierte es gut aber je mehr Bilder dazukamen, umso länger dauerte es bis die Seite geladen ist. Jetzt wollte ich die Galerie so erweitern, dass die Vorschaubilder auf dem Server gespeichert werden und neue erstellt werden, wenn noch keine vorhanden sind. Allerdings weiß ich nicht genau wie ich das anstellen soll. Das Script das für die Vorschau zuständig ist, ist das hier


<?php

// Variablen auslesen
while (list($key,$val)=each($_GET)) {
${$key} = $val; }

if($thumb)
{
// falls keine Größe vorhanden, dann default-Wert verwenden
if ($w AND $h) {$ThumbnailBreite = $w; $ThumbnailHoehe = $h;}
else {$ThumbnailBreite = 160; $ThumbnailHoehe = 90;}
// Thumbnail erstellung
// Bild Daten auslesen
$Bilddaten = getimagesize($thumb);
$Format = $Bilddaten[2];
$OriginalBreite = $Bilddaten[0];
$OriginalHoehe = $Bilddaten[1];
// JPEG File ?
if ($Format==2)
{
// Abbild der Bilder im Speicher erstellen
$Originalgrafik = ImageCreateFromJPEG($thumb);
$Thumbnailgrafik = ImageCreateTrueColor($ThumbnailBreite, $ThumbnailHoehe);

// Verhältnisse ausrechenn und die Mitte ermitteln
if (($OriginalBreite/$ThumbnailBreite) < ($OriginalHoehe/$ThumbnailHoehe)){
$AusschnittBreite=$OriginalBreite;
$AusschnittHoehe=($ThumbnailHoehe*($OriginalBreite/$ThumbnailBreite));
$OriginalPosX=0;
$OriginalPosY=($OriginalHoehe-$AusschnittHoehe)/2; }
else{
$AusschnittHoehe=$OriginalHoehe;
$AusschnittBreite=($ThumbnailBreite*($OriginalHoehe/$ThumbnailHoehe));
$OriginalPosX=($OriginalBreite-$AusschnittBreite)/2;
$OriginalPosY=0;}

// Thumbnail erstellen
ImageCopyResized($Thumbnailgrafik, $Originalgrafik, 0, 0, $OriginalPosX, $OriginalPosY,
$ThumbnailBreite, $ThumbnailHoehe, $AusschnittBreite, $AusschnittHoehe);

// ausgabe des thumbnails
header("Content-type: image/jpeg");
imagejpeg($Thumbnailgrafik,null,100);
}
}
?>


Wie mache ich es nun, dass überprüft wird, ob die Vorschaubilder da sind oder nicht, und falls nicht, dass diese dann in einem neuem Unterordner des eigentlichen Bildordners gespeichert werden? Die Galerie funktioniert so, dass ich einen Ordner hochladen muss und dieser dann direkt auf der Seite erscheint. Kann mir jemand dabei helfen?

 
penizillin
27-01-2007, 17:37 
 
Wie mache ich es nun, dass überprüft wird, ob die Vorschaubilder da sind oder nicht ... file_exists dass diese dann in einem neuem Unterordner des eigentlichen Bildordners gespeichert werden? imagejpeg hat mehrere parameter. weißt du, wofür sie da sind? insb. der zweite. while (list($key,$val)=each($_GET)) {
${$key} = $val; }
bist du dir über die gefahr dieses blocks im klaren?

 
picco
27-01-2007, 18:01 
 
Mit file_exists wird doch nur überprüft ob eine Datei dabei ist. Wie mache ich es denn mit mehreren?

Die Parameter von ImageJpeg werde ich mir mal genauer anschauen.

Nein, was für eine Gefahr und wie kann ich diese beheben?

 
penizillin
27-01-2007, 18:07 
 
Wie mache ich es denn mit mehreren? mit einer schleife. Nein, was für eine Gefahr und wie kann ich diese beheben? alles, was in die url geschrieben wird, wird zu einer variable gemacht. jeder hat den zugang zu dieser url. jeder hat also einen einfluss darauf, welche variablen in deinem skript gültig sind. so kann man versuchen, den ablauf des skriptes zu beeinflussen und u.u. böses erreichen. schau unter http://de.php.net/manual/en/function.extract.php

 
picco
27-01-2007, 18:13 
 
Ich verstehe nicht genau, was das im Link genau bedeutet. Ich bin auch nicht gerade der Beste in PHP bzw. habe erst vor einiger Zeit angefangen. Der zweite Parameter von iamgejpeg gibt den Dateinamen an. Wenn ich aber noch keine Thumbnails erstellt habe, wie soll ich dann schauen, ob diese da sind oder niht wenn ich keinen Dateinamen habe?

 
penizillin
27-01-2007, 18:17 
 
Wenn ich aber noch keine Thumbnails erstellt habe, wie soll ich dann schauen, ob diese da sind oder niht wenn ich keinen Dateinamen habe? wäre es nicht sinnvoll, eine konvention bzgl. der dateinamen für thumbnails einzuführen? dann könntest du den potentiellen dateinamen eines thumbnails berechnen. z.b. könntest du den präfix "thumb_" benutzen.

 
picco
27-01-2007, 18:39 
 
Ich denke, dass die Thumbnails die selben Namen wie das Originalbild, allerdings würden sich diese dann in einem anderen Ordner, das heißt im Unterordner thumbsnails oder sowas befinden. Müsste ich ich diesen dann auch "berechnen"?

 
penizillin
27-01-2007, 18:41 
 
wenn der originalname in $name gespeichert ist und die thumbnails in einem unterordner namens "thumbs" liegen, ist der zu überprüfende pfad "thumbs/".$name

 
picco
27-01-2007, 19:22 
 
Zumindest sollen die Thumbnails dort liegen. Das heißt ich muss per Schleife überprüfen, ob sich das Bild dort befindet?

 
wahsaga
27-01-2007, 19:45 
 
Original geschrieben von picco
Das heißt ich muss per Schleife überprüfen, ob sich das Bild dort befindet?
Nein.

Um zu fragen, gibt es das Bild "thumbs/xyz.jpg", brauchst du keine Schleife.

 
picco
27-01-2007, 20:22 
 
Ich will aber wissen, ob nun für jedes Bild ein Thumbnail vorhanden ist. Wenn ich beispielsweise neue Bilder in die Galerie reinkopiere, dann würden sie nicht erscheinen, oder sehe ich das falsch?

 
Damian1984
27-01-2007, 20:28 
 
Man kann sich aber auch anstellen...

if(!isset($thumbdir.$filename)){
// mache thumb.....
}

 
picco
27-01-2007, 23:27 
 
Und wie genau sorge ich dafür, dass die thumbnails nun in den jeweiligen Unterordnern gespeichert werden? Jedes Verzeichnis soll ja den Ordner Thumbs erhalten, damit diese dort gespeichert werden können.

 
wahsaga
27-01-2007, 23:54 
 
In dem du den "jeweiligen" Ordner als Pfad beim Speichern auf Platte mit angibst.

 
picco
27-01-2007, 23:58 
 
Das heißt ich muss nun für den Ordner einen neuen Pfad anlegen? Ich bin nun etwas verwirrt.

Also zunächst überprüfe ich, ob sich Vorschaugrafiken in den Ordnern befinden. Falls nicht sollen welche erstellt werden.

Mir geht es nun darum zu wissen, wie ich nun PHP sagen soll, dass ein Ordner erstellt werden soll und dass dort die Thumbnails gespeichert werden sollen.

 
wahsaga
28-01-2007, 02:27 
 
Original geschrieben von picco
Also zunächst überprüfe ich, ob sich Vorschaugrafiken in den Ordnern befinden.
Gut. Dazu musst du unter anderem was wissen? Wie der Ordner heisst.

Wenn noch gar nicht sichergestellt ist, dass der Ordner existiert - dann musst du das halt auch vorher noch abfragen.
Mir geht es nun darum zu wissen, wie ich nun PHP sagen soll, dass ein Ordner erstellt werden soll und dass dort die Thumbnails gespeichert werden sollen.
:rtfm: Das Kapitel über Dateisystemfunktionen im Manual sagt dir alles nötige.

 
picco
12-02-2007, 14:10 
 
Ok, ich bin nun soweit, dass ich den jeweiligen Verzeichnissen die Unterverzeichnisse thumbs erstellen kann. Den Code dafuer habe ich der Hauptdatei eingebaut und er sieht so aus:


$prev = "thumbs/";
$path3 = "$dir/$prev";

if(!file_exists($path3) && $dir != "content/bilder") {
mkdir($path3,"777")
echo "$path3 erstellt";


Ich denke, dass ich hier nicht viel kommentieren muss. $dir ist ein Array. Die Verzeichnisse werden erstellt. Das klappt. Wenn ich die Seite allerdings nochmal aktualisiere, dann werden in den Verzeichnissen thumbs nochmal die selben erstellt. Wie kann ich das verhindern?

 
penizillin
12-02-2007, 14:30 
 
indem du die seite nicht erneut aufrufst.

sorge dafür, dass das skript, welches die erstellung des ordners garantiert

1) einen absoluten pfad bekommt und
2) nur einmal aufgerufen wird (heißt, "hängt nicht von einem seitenaufruf ab, sondern von einer aktion: link klicken, button drücken o.ä.")

 
picco
12-02-2007, 15:43 
 
Was heisst den absoluter Pfad? $dir ist ein Array. Wenn ein neuer Ordner hochgeladne wird, dann muss das Script erneut aufgerufen werden, damit auch in dem neuen Verzeichniss ein neuer thumbs-Ordner erstellt wird.

Normalerweise ist es so, dass sich die Bildergalerie in einer Seite befindet. Wenn die Bilderseite aufgerufen wird, dann komme ich zur Uebersicht. Das heisst wenn der User wieder zur Uebersicht will, wird das Script erneut aufgerufen. Ich verstehe nicht genau, warum immer wieder thumbs neu erstellt wird.

 
wahsaga
12-02-2007, 16:04 
 
Original geschrieben von picco
Wenn ein neuer Ordner hochgeladne wird, dann muss das Script erneut aufgerufen werden, damit auch in dem neuen Verzeichniss ein neuer thumbs-Ordner erstellt wird.
Warum eigentlich?

Warum überprüfst du nicht an der Stelle, wo du ein Thumbnail erzeugen willst, ob es bereits einen Unterordner thumbs im aktuellen Verzeichnis gibt - und wenn nein, dann erzeugst du ihn halt mal eben fix ...?

 
penizillin
12-02-2007, 16:04 
 
http://de.wikipedia.org/wiki/Pfad#Dateisystem$dir ist ein Array. und was soll dann $dir != "content/bilder" bedeuten?

Wenn ein neuer Ordner hochgeladne wird ... wie geht das eigentlich?

 
picco
12-02-2007, 16:10 
 
@wahsaga Weil ich noch nicht soweit bin. Erstmal moechte, die Ordner erstellen. Wie ich das dann mit den thumbs mache, weiss ich noch nicht. Sie werden zwar erstellt aber ich habe immer noch keine Moeglichkeit gefunden, sie zu speichern.

@penizillin Ohne $dir != "content/bilder" wird auch im Hauptverzeichnis ein Ordner thumbs erstellt. Damit wird es unterbunden.

 
penizillin
12-02-2007, 16:21 
 
wenn $dir ein array ist, ist
array != string immer wahr.

 
picco
12-02-2007, 18:17 
 
Das letzte verstehe ich nun nicht. Ich habe nun noch eine weitere Bedingung eingefuegt. Erst soll ueberprueft werden, ob die Verzeichnisse vorhanden sind. Wenn ja, kommt dann die Ueberpruefung mit != "content/bilder". Erst dann sollen die Verzeichnisse thumbs erstellt werden. Beim aktualisieren, werden in den Verzeichnissen dann allerdings immer noch Unterverzeichnisse mit dem Namen thumbs erstellt.


Alle Zeitangaben in WEZ +2. Es ist jetzt 23:27 Uhr.