[PHP5] Fragen zum erstellen eines Bildupload Scripts

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [PHP5] Fragen zum erstellen eines Bildupload Scripts

    Hallo,

    ich schreibe gerade an einem Bild Uploadscript für meine Seite.

    Jetzt bin ich beim Schreiben auf folgende Idee gekommen, falls ein User mal so "ungeschickt" war und seinem Bild ausversehen eine falsche oder zweite Endung gegeben hat (z.B. bild.jpg.txt), dann erkennt zwar getimagesize immer noch, das es ein Bild ist, ABER ich habe immer mit pathinfo mir die Dateiendung ausgelesen, mit der das Bild weiter gespeichert wird... diese lautet aber nun auch .txt

    Als Alternative hatte ich mir überlegt jedes Bild mit JD neu zu berrechnen und als JPG abzuspeichern ABER bei Bildern wie PNG und GIF gehen dann die Transparenzen über den Jordan und ich muss ja auch wissen mit welchem imagecreatefrom ich die Datei importieren muss.

    Hat jemand Lösungsvorschläge? Oder einfach eine Fehlermeldung ausgeben wenn die Dateieindung nicht jpg, jpeg, gif, png oder bmp ist (Habe ich eine Endung vergessen?)

    Gruß
    Markus

  • #2
    Benutz imagemagick.

    Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

    bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
    Wie man Fragen richtig stellt

    Kommentar


    • #3
      Original geschrieben von ghostgambler
      Benutz imagemagick.
      Im Gegensatz zu GD leider nicht auf dem Webserver vorhanden wo das Script zum Einsatz kommen soll. Daher habe ich micht für die Filterung der Dateiendungen entschieden und bmp Dateien ausgeschlossen.

      Das Script an sich ist fertig, aber wahrscheinlich habe ich es viel zu kompleziert geschrieben. Ihr könnt ja mal einen Blick drauf werfen, habe die einzelnen Schritte direkt im Quellcode kommentiert, vor dem Script ist noch eine Überprüfung geschaltet ob überhaupt eine Datei gesendet wurde. Kann ich irgendwie noch die Qualität der Thumbs erhöhen? Vor allem bei gif Bildern ist die Quali der Thumbs sehr schlecht.

      PHP-Code:
      $temp_pic $_FILES['userfile']['tmp_name'];         
      $file_path pathinfo($_FILES['userfile']['name']);
      $file_info getimagesize($temp_pic);
      if(!isset(
      $file_info['mime'])){
         
      $pic_info .= '<h1>Die Datei, die Du ausgew&auml;hlt hast, war kein Bild.</h1>';
      }elseif(
      $_FILES['userfile']['size'] >= '2100000'){
         
      $pic_info .= '<h1>Die Datei, die Du ausgew&auml;hlt hast, ist zu gro&szlig;.</h1>';
      }elseif(
         
      $file_path['extension'] == 'gif' 
         
      OR $file_path['extension'] == 'jpg'
         
      OR $file_path['extension'] == 'jpeg' 
         
      OR $file_path['extension'] == 'png'
      ){
         
      //Speichern des Bildtypens, IP und Uploadzeit
         
      mysql_query("
         INSERT INTO `lcms_picup` 
         (`typ`,`ip`,`time`) 
         VALUES 
         ('"
      .$file_path['extension']."','".$_SERVER['REMOTE_ADDR']."','".time()."')");

         
      //Weil ich einen wirklich einmaligen Dateinamen haben wollte, aber auch das Durchblättern 
         //der Bilder durch einfaches runterzählen verhindern wollte: Zufallszahl + id aus 
         //der Datenbank
         
      $file_name rand(100000999999).mysql_insert_id();
         
      mysql_query("
            UPDATE `lcms_picup` 
            SET `name`='"
      .$file_name."' 
            WHERE (`id`='"
      .mysql_insert_id()."')
         "
      );
         
      $target_name 'picupload/images/org/'.$file_name.'.'.$file_path['extension'];
         
      rename($temp_pic$target_name);

         
      //Hier wird geprüft welche Thumbs erstellt werden
         
      if($file_info[0] > 100){
            
      $h round($file_info[1] / ($file_info[0] / 100));
            
      $thumb[100] = $h;
            if(
      $file_info[0] > 640){
               
      $h round($file_info[1] / ($file_info[0] / 640));
               
      $thumb[640] = $h;
               if(
      $file_info[0] > 800){
                  
      $h round($file_info[1] / ($file_info[0] / 800));
                  
      $thumb[800] = $h;
               }                    
            }
         }

         
      //erstellen der Thumbs
         
      if(isset($thumb)){
            foreach (
      $thumb as $width => $height){
               if(
      $file_path['extension'] == 'jpg' OR $file_path['extension'] == 'jpeg'){
                  
      $im imagecreatetruecolor($width$height);
                  
      $source imagecreatefromjpeg($target_name);
                  
      imagecopyresized($im$source0000$width$height$file_info[0], $file_info[1]);
                  
      $thumb_name 'picupload/images/'.$width.'/'.$file_name.'.jpg';
                  
      imagejpeg($im$thumb_name);
                  
      imagedestroy($im);
               }

               
      //Das gleiche dann noch mit gif und png

            
      }
         }
      }else{
      $pic_info .= '<h1>Die Datei hat eine falsche Dateiendung ('.$file_path['extension'].')!</h1>';

      Zuletzt geändert von Laire; 09.02.2009, 09:22.

      Kommentar


      • #4
        getimagesize sagt dir doch, von welchem Typ das ist. Dann kannst du auch wieder deine eigene Dateiendung verwenden.

        Kommentar


        • #5
          Jupp, aber momentan schwanke ich zwischen: Auch jedem DAU wie mir es recht zu machen, oder einfach drauf bestehen, das die Dateien die richtige Endung haben ;-)

          Welches Risiko gehe ich eigentlich ein, indem ich die Ordner in denen die Bilder abgespeichert werden auf die Rechte 777 setzte?

          Kommentar


          • #6
            Welches Risiko gehe ich eigentlich ein, indem ich die Ordner in denen die Bilder abgespeichert werden auf die Rechte 777 setzte?
            Wenn du auf einem Server mit mehreren Webhostern bist, darf jeder andere User auf das Verzeichnis zugreifen.

            Kommentar


            • #7
              Hm muessen denn die Ordner fuer diese Funktion so weitreichende Berechtigungen haben?

              Kommentar


              • #8
                Wenn du bei einem vernünftigen Hoster bist: Nein.
                Dann reicht 770 oder sogar 700.

                Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                Wie man Fragen richtig stellt

                Kommentar


                • #9
                  0750 wird auch immer wieder gern genommen
                  Oft sind ja httpd und PHP-Script Owner unterschiedlich, aber in der selben Gruppe.
                  Wir werden alle sterben

                  Kommentar


                  • #10
                    Ok werde es testen vielen Dank fuer die Tipps, wenn ich jetzt noch Hilfe in meinem anderen Thread bekomme, bin ich gluecklich

                    Kommentar

                    Lädt...
                    X