Webdesign in Siegen

Upload und Ausgabe mehrere Bilder

Fragen zum Thema PHP können hier gestellt werden

Moderator: Basti

Upload und Ausgabe mehrere Bilder

Beitragvon susi1600 am 12.10.2007, 16:54

Hallo,

als PHP-Neuling bin ich auf der Suche nach einer guten Lösung für folgendes Vorhaben:

Ich habe einen Verleih für Gewänder.
Die Gewänder werde in einer Datenbank gespeichert und mit einer while-Schleife, begrenzt auf 6Stk. pro Seite, ausgegeben. Das funktioniert auch schon alles.

Nun möchte ich die Möglichkeit haben, für jedes Gewand bis zu 6 Bilder auf einmal hochzuladen, die dann bei der Ausgabe als 6 verlinkte Thumbs und 1 großes Bild dargestellt werden (so wie in Ebay zum Beispiel).

Was gibt es denn da für Möglichkeiten?
Habe davon gelesen, dass man Bilder in die Datenbank hochladen kann, diese aber dann langsamer wird.
Ich finde zahlreiche Tutorials, in dem vom Upload einer Datei geschrieben wird, kennt jemand eines, mit mehreren Dateien gleichzeitig?
Wenn man die Bilder in ein Verzeichnis hochlädt, wie verhält es sich dann mir dem verlinken, dass die Bilder auch zum richtigen Gewand angezeigt werden -> Bildpfad in der Datenbank speichern -> wie ist es dann mit Bilder löschen, das muss doch dann manuell gemacht werden und der Bildpfad in der Datenbank auch manuell, oder?

Weiß da jemand eine gute Lösung? Kenne mich mit den Möglichkeiten noch nicht so aus, was geht und was geht nicht...

Wäre für Antworten dankbar, viele Grüße,
Susanne
susi1600
Mitglied
 
Beiträge: 23
Registriert: 06.10.2007

Beitragvon Manuel am 12.10.2007, 18:16

Hallo Susanne!

Ich wollte damals auch gerne komplette Ordner mit PHP hochladen können, das geht meines Wissens aber nicht. Einzige Möglichkeit: rar-Datei hochladen und auf dem Server entpacken, was dann aber nicht garantiert, dass diese Datei dann wirklich nur Bilder enthält.

Demnach hast du die Möglichkeit, den Nutzer der Reihe nach immer wieder ein Bild hochladen zu lassen oder du machst direkt 6 Auswahlfelder für die Datei untereinander.

Natürlich kannst du die Bilder auch in einer Datenbank speichern. Für mich hat es sich aber meist als sinnvoller erwiesen, lediglich einen Link in dieser Datenbank zu speichern.
Du könntest beispielsweise eine ID speichern und dann beim Upload der 6 Bilder deren Namen auf ID-bildname ändern. Somit kannst du immer genau bestimmen welche Bilder ausgelesen werden sollen, da du deren ID kennst. Das Löschen der Bilder geht ebenso.

Natürlich führen auch hier wieder viele Wege nach Rom. Du könntest auch viele Ordner anlegen und dann mit einem Script einen Ordner auslesen, was ebenfalls sehr einfach ist, was aber meines Erachtens irgendwann zu viele Ordner erzeugt.

Die Möglichkeit, die ich verwenden würde hängt auch ein wenig davon ab, um welche Dimension es sich bei deinem Vorhaben handelt.

Lg,
Manuel ;-]
Benutzeravatar
Manuel
Site Admin
 
Beiträge: 8912
Registriert: 10.12.2004
Wohnort: Asbach

Beitragvon susi1600 am 12.10.2007, 19:57

Hallo,

ich glaube ich hab meine Frage nicht richtig gestellt...
Ich möchte gar keinen kompletten Ordner hochladen, ich will mehrere Dateien gleichzeitig hochladen - gibts da ein Tutorial irgendwo, ich find einfach keines. Bzw. in denen, die ich gefunden habe, wird immer nur beschrieben, wie man EINE datei hochlädt.... aber das hab ich mittlerweile in meinem 850-Seiten-Wälzer über PHP gefunden :thumbsup:
Allerdings gibt es ein Problem: Wenn ich nun das Eingabeformular abschicke, wird der Datensatz so oft erzeugt, wie bilder hochgeladen werden. Wie kann ich denn das lösen?

Hier mal der Code

Code: Alles auswählen
<?
//* Bilder Upload
   
$kleidfarbe= $_POST['kleidfarbe'];
$uploadverzeichnis= 'bilder/';

if (isset($_POST['bilderupload']) && !empty($_FILES["bilder"]["name"])) {
        
if (!file_exists($uploadverzeichnis))
{mkdir ($uploadverzeichnis,0777);}     
      
   foreach($_FILES as $bild)
      for($i=0; $i<sizeof($bild['name']); $i++)
         if($bild['name'][$i]) {
         $bildname= $kleidfarbe."_".$i.".jpg";
         move_uploaded_file($bild['tmp_name'][$i], "{$uploadverzeichnis}/{$bildname}") OR die ("Konnte nicht kopiert werden");
         print $bildname."wurde gespeichert<br>";
      }
}
?>
        <input type="file" name="bilder[]">
        <input type="file" name="bilder[]">
        <input type="file" name="bilder[]">
        <input type="file" name="bilder[]">
        <input type="file" name="bilder[]">
        <input type="hidden" name="bilderupload">
susi1600
Mitglied
 
Beiträge: 23
Registriert: 06.10.2007

Beitragvon Manuel am 13.10.2007, 23:13

Hi du!

Ein und das selbe Bild wird dann 6 mal erzeugt oder wie darf ich deine Frage genau verstehen?
Benutzeravatar
Manuel
Site Admin
 
Beiträge: 8912
Registriert: 10.12.2004
Wohnort: Asbach

Beitragvon Basti am 14.10.2007, 11:38

Verstehe gerade auch nicht genau, was du meinst.

Hast du denn im Formular auch noch enctype="multipart/form-data" angegeben?
Und in der foreach()-Schleife müsstest du doch eigentlich $_FILES ['bilder'] angeben, da du im Formular ja einen Array erzeugst, der bilder[] heißt, wobei ich mir da nicht ganz sicher bin.

Naja, sag uns am besten einfach mal, was genau falsch abläuft, dann sehen wir mal weiter ;)
Benutzeravatar
Basti
Moderator
 
Beiträge: 1902
Registriert: 15.06.2006
Wohnort: Rheinbreitbach

Beitragvon susi1600 am 15.10.2007, 21:55

So, also das mit den Bilder klappt jetzt, alle werden schön erstellt und gespeichert. Nun passend dazu mein nächstes Problem: Entsprechend der Bilder sollen Vorschaubilder erzeugt werden. Mit meinem Code werden diese aber nicht erstellt - error_reporting(E_ALL); ergibt keine Fehlerausgabe

Hier mal der Code

Code: Alles auswählen
//* Bilder Upload
    $uploadverzeichnis= 'bilder/';
    $thumbverzeichnis='bilder/thumbs/';

    if (isset($_POST['bilderupload']) && !empty($_FILES["bilder"]["name"])) {
       
    if (!file_exists($uploadverzeichnis))
    {mkdir ($uploadverzeichnis,0777);}     
     
       foreach($_FILES as $bild)
      for($i=1; $i<sizeof($bild['name']); $i++)
         if($bild['name'][$i]) {
         $bildname= $kleidfarbe."_".$i.".jpg";
         move_uploaded_file($bild['tmp_name'][$i], "{$uploadverzeichnis}/{$bildname}")
         OR die ("Bilder konnten nicht kopiert werden");
 
         $quellbild= 'bilder/'.$bildname;
         
         //ermittelt Größe des Bildes als Array
         $groesse_bild= getimagesize($quellbild);                       
         
         //Breite des Bildes
         $breite_bild= $groesse_bild[0];                                   
         
         //Höhe des Bildes
         $hoehe_bild= $groesse_bild[1];                                   
           
           
         $thumbname= "thumb_".$kleidfarbe."_".$i.".jpg";
         
         //gewünschte Höhe der Thumbs
         $thumb_hoehe= 100;                                               
         
         //errechnen der Breite der Thumbs
         $thumb_breite= ceil($breite_bild*$thumb_hoehe/$hoehe_bild);       
           
         $quelle= imagecreatefromjpeg($quellbild);
         
         //erstellen des Thumb vom Bild
         $thumb= imagecreate($thumb_breite, $thumb_hoehe);               
         imagecopyresized($thumb, $quelle, 0, 0, 0, 0,
         $thumb_breite, $thumb_hoehe, $breite_bild, $hoehe_bild);
         
         move_uploaded_file($thumb['tmp_name'][$i], "{$thumbverzeichnis}/{$thumbname}")
         OR die ("Thumbs konnten nicht erstellt werden");         
 
}


hat da jemand einen Fehler für mich?
susi1600
Mitglied
 
Beiträge: 23
Registriert: 06.10.2007

Beitragvon Manuel am 15.10.2007, 21:59

Hast du denn mal getestet an welcher Stelle es hängt? Kommt denn die Fehlermeldung, dass es nicht erstellt werden konnte? Ich denke mal die Rechte der Verzeichnisse sind richtig gesetzt? Der Quellcode ist selbst geschrieben? Oder sollte man da mal genauer nach Fehlern suchen dann?

Lg,
Manuel ;-]
Benutzeravatar
Manuel
Site Admin
 
Beiträge: 8912
Registriert: 10.12.2004
Wohnort: Asbach

Beitragvon susi1600 am 15.10.2007, 22:04

Also er gibt dann die Meldung aus, dass die Thumbs nicht erstellt werden konnten.

Also getippt hab ich es selbst, kopiert ist nix - Quelle ist ein Buch, da wars aber nur für ein Bild gedacht, habs halt umgeschrieben.
susi1600
Mitglied
 
Beiträge: 23
Registriert: 06.10.2007

Beitragvon Manuel am 15.10.2007, 22:09

Na dann würde ich dir erst mal dazu raten, die Funktion für ein einzelnes Bild zu bauen. Du kannst Quellcode dann übrigens auch auslagern, indem du dir eine function schreibst und diese dann einfach nur noch aufrufst. Kann oft sehr praktisch sein.

Also wie gesagt, ich würde erst mal ein Beispiel coden und nur ein Bild ohne Upload verändern und wieder speichern. Wenn schon das nicht klappt weisst du zumindest, wie du den Fehler eingrenzen kannst. Ich persönlich habe damit zu wenig gemacht, als dass ich gerade so direkt nen Fehler sehen würde, daher leider nur dieser allgemeine Tipp von mir. Ebenso sehr hilfreich ist die Ausgabe von Zwischenwerten und Rückgabewerten der einzelnen Funktionen die du verwendest.
Benutzeravatar
Manuel
Site Admin
 
Beiträge: 8912
Registriert: 10.12.2004
Wohnort: Asbach

Beitragvon Ingo am 15.10.2007, 22:47

Hi.
Bin kein php-Guru - leider. Ich bleibe an der vorletzten Zeile hängen:
move_uploaded_file($thumb['tmp_name'][$i], ...
Und zwar wegen der Funktion und wegen des $thumb[...]. Ich hätte
hier eher an sowas gedacht wie
imagejpeg($thumb, "{$thumbverzeichnis}/{$thumbname}")
Vllt. lieg ich auch daneben - war n langer Tag heute ;o)
Benutzeravatar
Ingo
Moderator
 
Beiträge: 625
Registriert: 01.04.2007
Wohnort: Neuss/NRW

Beitragvon susi1600 am 16.10.2007, 21:02

Hahaaaaaa - es klappt!!

@macping - mit imagejpeg funktionierts :)
Vielen Dank!!

Vllt. hat jemand mal das gleiche Problem (glaub ich zwar nicht - aber für den Fall der Fälle) - hier der Code:

Code: Alles auswählen
//* Bilder Upload
$uploadverzeichnis= 'bilder/';
$thumbverzeichnis='bilder/thumbs/';
if (isset($_POST['bilderupload']) && !empty($_FILES["bilder"]["name"])) {
        
   //* falls nicht vorhanden: Verzeichnisse erstellen
   if (!file_exists($uploadverzeichnis))
        {mkdir ($uploadverzeichnis,0777);}
   if (!file_exists($thumbverzeichnis))
        {mkdir ($thumbverzeichnis,0777);}     
      
   //* Grosse Bilder mit neuem Namen nummeriert (1-6) abspeichern
   foreach($_FILES as $bild)
      for($i=1; $i<sizeof($bild['name']); $i++)
      if($bild['name'][$i]) {
      $bildname= $name."_".$i.".jpg";
      copy($bild['tmp_name'][$i], "{$uploadverzeichnis}/{$bildname}")
      OR die ("Bilder konnten nicht gespeichert werden");
         
$quellbild= 'bilder/'.$bildname;
//ermittelt Größe des Bildes als Array         
$groesse_bild= getimagesize($quellbild);
//Breite des Bildes
$breite_bild= $groesse_bild[0];
//Höhe des Bildes
$hoehe_bild= $groesse_bild[1];

$thumbname= "thumb_".$name."_".$i.".jpg";
//gewünschte Höhe der Thumbs
$thumb_hoehe= 100;   
//errechnen der Breite der Thumbs      
$thumb_breite= ceil($breite_bild*$thumb_hoehe/$hoehe_bild);      
         
$quelle= imagecreatefromjpeg($quellbild);
//erstellen des Thumb vom Bild         
$thumb= imagecreatetruecolor($thumb_breite, $thumb_hoehe);            
imagecopyresampled($thumb, $quelle, 0, 0, 0, 0,
$thumb_breite, $thumb_hoehe, $breite_bild, $hoehe_bild);
imagejpeg($thumb, "{$thumbverzeichnis}/{$thumbname}")
OR die ("Thumbs konnten nicht erstellt werden");
}


Nochmals vielen Dank für die Hilfe 8)
susi1600
Mitglied
 
Beiträge: 23
Registriert: 06.10.2007

Beitragvon =Max= am 22.10.2007, 06:55

Auch wenn es schon gelöst ist auf cms.master-iv.de da ist ein upload im cms drin. Da kann man schon bis zu vier hochladen. Dazu hat dieser Bildupload noch ein paar Extras ;) Vlt willste ja mal anschaun. Einfach auf downloaden klicken ;)
=Max=
Mitglied
 
Beiträge: 428
Registriert: 14.01.2007


Zurück zu PHP

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast