Ankündigung

Einklappen
Keine Ankündigung bisher.

Datei Upload wie machen

Einklappen

Neue Werbung 2019

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

  • Datei Upload wie machen

    Hallo zusammen,
    ich beschäftige mich erst seit kurzem mit php und habe folgendes Problem welches ich nicht lösen kann;
    Ich möchte Dateien bzw. Bilder in einen Ordner hochladen möglichst sicher.
    Das durchsuchen der Festplatte geht, das Hochladen an sich auch, aber es wird dann mit der Meldung (die ich selbst definiert habe) - Möglicher Angriff beim Hochladen - abgebrochen, und das verstehe ich nicht.
    Ein anderes Problem ist das wenn ich die Seite aufrufe sofort die Fehlermeldung - Dies ist keine Bilddatei, jpeg-jpg-jpe verwenden! - da steht.
    Kann mir da jemand helfen?
    Hier mein script dazu:

    PHP-Code:
     <body>
     <p>Bild hochladen</p>
     <p>&nbsp;</p>
     <p>&nbsp; </p>
     <form enctype="multipart/form-data" action="up.php" method="post">
         <input type="hidden" name="MAX_FILE_SIZE" value="1000000">
        Dieses Bild hochladen:<input name="userfile" type="file">
        <input type="submit" value="Hochladen">
         
     </form>
     <?php
         
    if ($_FILES['userfile']['error'] > 0)  {
            echo 
    'Problem: ';
                switch (
    $_FILES['userfile']['error']) {
                    case 
    1: echo 'Die Datei ist größer als uploud_max_filesize.' ; break;
                    case 
    2: echo 'Die Datei ist größer als ma_file_size.' ; break;
                    case 
    3: echo 'Die Datei wurde unvollständig hochgeladen.' ; break;
                    case 
    4: echo 'Es wurde keine Datei hochgeladen.' ; break;
                }
                exit;
            }
        if (
    $_FILES['userfile']['type'] != 'image/jpeg') {
            echo 
    'Problem: Dies ist keine Bilddatei, jpeg-jpg-jpe verwenden!';
            exit;
            }
        
        
    $upfile '/uploads/' $_FILES['userfile']['name'];
        if (
    is_uploaded_file($_FILES['userfile']['tmp-name'])) {
            if (!
    move_uploaded_file($_FILES['userfile']['tmp-name'], $upfile)) {
                echo 
    'Problem: Konnte die Datei nicht in Zielverzeichniss verschieben.';
                exit;
            }
        } else {
            echo 
    'Problem: Möglicher Angriff beim Hochladen. Dateiname: ';
            echo 
    $_FILES['userfile']['name'];
            exit;
            }
        echo 
    ' Die Datei wurde erfolgreich hochgeladen.<br><br>';
            
    $fp fopen($upfile'rb');
            
    $contents fread ($fpfilesize ($upfile));
            
    fclose ($fp);
            
        
    $contents strip_tags($contents);
        
    $fp fopen($upfile'w');
        
    fwrite($fp$contents);
        
    fclose($fp);
        
        echo 
    'Vorschau der hochgeladenen Datei:<br><hr>';
        echo 
    $contents;
        echo 
    '<br><hr>';
        
        
    ?>
        </body>


  • #2
    Und was steht dann in $_FILES['userfile']['type']?

    PS
    Bitte benutze für Code PHP-Tags, das erhält dir erstens die Formatierung, und schaltet zweitens das Syntax-Highlighting ein.
    Gruss
    L

    Kommentar


    • #3
      Hi, benutze bitte die PHP Tags um den Code mit Syntaxhighlight darzustellen.

      Zum Problem mit dem jpeg Fehler. Wenn du die Seite aufrufst ist $_FILES['userfile']['type'] leer, da ja noch keine Datei hochgeladen wurde. Also ist es auch !== 'image/jpeg' daher resultiert die Fehlermeldung.

      Die andere Fehlermeldung kommt ja da is_uploaded_file() fehl schlägt. Diese Funktion brauchst du meines Wissens gar nicht mehr zu nutzen. Vor allem wenn register_globals auf off steht! Also die if Abfrage mit dieser Funktion würde ich komplett weg lassen.

      Kommentar


      • #4
        Zitat von lazydog Beitrag anzeigen
        Und was steht dann in $_FILES['userfile']['type']?

        PS
        Bitte benutze für Code PHP-Tags, das erhält dir erstens die Formatierung, und schaltet zweitens das Syntax-Highlighting ein.
        Das hilft mir nicht wirklich weiter.
        Wie an meinem Post Counter zu sehen war das mein erster Beitrag, aber ich werden zukünftig bei Codes drauf achten.

        Zum Problem mit dem jpeg Fehler. Wenn du die Seite aufrufst ist $_FILES['userfile']['type'] leer, da ja noch keine Datei hochgeladen wurde. Also ist es auch !== 'image/jpeg' daher resultiert die Fehlermeldung.
        Ah ok,
        und wie umgehe ich das Problem? Weil auf die Fehlermeldung möchte ich nicht verzichten. (Wobei ich bisher dachte das php Code erst dann ausgeführt wird wenn es dazu aufgefordert wird, und nicht schon bei beginn.)

        mfg

        Kommentar


        • #5
          PS
          Bitte benutze für Code PHP-Tags, das erhält dir erstens die Formatierung, und schaltet zweitens das Syntax-Highlighting ein.
          Das hilft mir nicht wirklich weiter.
          Wie an meinem Post Counter zu sehen war das mein erster Beitrag, aber ich werden zukünftig bei Codes drauf achten.
          Es soll ja auch UNS weiterhelfen. So gucke ich mir jedenfalls keinen Spaghetti Code an. Benutz doch einfach den 'Ändern' Button und rücke den Code ein. Dann wird Dir sicher auch besser geholfen.
          --

          „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
          Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


          --

          Kommentar


          • #6
            Es wird doch "aufgefordert". Wo steht den was dass das nicht ausgeführt werden sollte? Da steht einfach eine Abfrage und diese wird natürlich ausgeführt, warum sollte sie nicht ausgeführt werden?

            Du musst eben noch prüfen ob das Formular auch abgesendet wurde.

            Kommentar


            • #7
              Ok, das mir der Abfrage ob versendet wurde habe ich nicht bedacht.

              is_uploaded_file() fehl schlägt. Diese Funktion brauchst du meines Wissens gar nicht mehr zu nutzen
              Die funktion habe ich rausgenommen und nach einem Test bekamm ich die folgende Fehlermeldung: Verschieben zum Zielverzeichnis.
              Was ist hier das Problem?


              PHP-Code:
              $upfile '/uploads/' $_FILES['userfile']['name'];
                  if (
              is_uploaded_file($_FILES['userfile']['tmp-name'])) {
                      if (!
              move_uploaded_file($_FILES['userfile']['tmp-name'], $upfile)) {
                          echo 
              'Problem: Konnte die Datei nicht in Zielverzeichniss verschieben.';
                          exit; 
              PS: Habe meinen Leitbeitrag editiert, ich hoffe ihr habt mit einem Frischling etwas nachsehen

              Kommentar


              • #8
                Du hast die Funktion nicht rausgenommen ...

                Kommentar


                • #9
                  tmp_name statt tmp-name verwenden. Sicheres Indiz dafür, dass Du Dir Warnungen und Hinweise von PHP nicht anzeigen läßt, Thema error_reporting, display_errors und error_log.

                  Und wenn Du wissen willst, ob überhaupt ein Fileupload zu bearbeiten ist oder nicht, teste einfach die Existenz von $_FILES['userfile'] mit isset() ab.
                  PHP-Code:
                  <?php
                  if (!isset($_FILES['userfile'])) {
                    
                  // kein Upload
                    // ## Formular anzeigen ##
                  }
                  else if (
                  $_FILES['userfile']['error'] != 0)  {
                    
                  // ## Problembehandlung ##
                  }
                  else if ( 
                  isJpegFile($_FILES['userfile'])) {
                    
                  // ## ungültiger Inhalt ##
                  }
                  else if(!
                  move_uploaded_file($_FILES['userfile']['tmp_name'], '/uploads/' $_FILES['userfile']['name']) {
                    
                  // ## move..file fehlgeschlagen ##
                  }
                  else {
                    
                  // ## file upload fehlerfrei abgeschlossen ##
                  }
                  Dann bleibt noch der Knackpunkt isJpegFile().
                  Der Wert in $_FILES[]['type'] wird vom Browser geschickt. Da kann alles mögliche drin stehen. Wenn Du wirklich wissen willst, was sich im Upload befindet, musst Du Dir den Inhalt ansehen. Zum Beispiel mit getimagesize() oder fileinfo.

                  Kommentar


                  • #10
                    PHP-Code:
                     <?php
                    if (!isset($_FILES['userfile'])) {
                      
                    // kein Upload
                      // ## Formular anzeigen ##
                    }
                    else if (
                    $_FILES['userfile']['error'] != 0)  {
                      
                    // ## Problembehandlung ##
                    }
                    else if ( 
                    isJpegFile($_FILES['userfile'])) {
                      
                    // ## ungültiger Inhalt ##
                    }
                    else if(!
                    move_uploaded_file($_FILES['userfile']['tmp_name'], '/uploads/' $_FILES['userfile']['name']) {
                      
                    // ## move..file fehlgeschlagen ##
                    }
                    else {
                      
                    // ## file upload fehlerfrei abgeschlossen ##
                    }
                    Das klingt interessant, aber wo genau muss ich das einfügen; wird damit folgender Teil ersetzt?
                    PHP-Code:
                     if ($_FILES['userfile']['error'] > 0)  {
                            echo 
                    'Problem: ';
                                switch (
                    $_FILES['userfile']['error']) {
                                    case 
                    1: echo 'Die Datei ist größer als uploud_max_filesize.' ; break;
                                    case 
                    2: echo 'Die Datei ist größer als ma_file_size.' ; break;
                                    case 
                    3: echo 'Die Datei wurde unvollständig hochgeladen.' ; break;
                                    case 
                    4: echo 'Es wurde keine Datei hochgeladen.' ; break;
                                }
                                exit;
                            } 
                    oder ist das schon der Gesamte php Teil?


                    Du hast die Funktion nicht rausgenommen ...
                    Doch habe ich, nur habe ich zum besseren Verständnis an welcher stelle die Fehlermeldung steht, die Zeilen aus meinem ersten Beitrag verwendet und da war der Teil noch drin.

                    Kommentar


                    • #11
                      Zitat von Black Dragon Beitrag anzeigen
                      oder ist das schon der Gesamte php Teil?
                      Ja, das ist sozusagen die Zusammenfassung der gesamten Struktur. Den von Dir genannte Codeschnippsel habe ich zu
                      PHP-Code:
                      else if ($_FILES['userfile']['error'] != 0)  {
                        
                      // ## Problembehandlung ##

                      verkürzt. Es ging mir nur um die Struktur, nicht um die genaue Ausformulierung.

                      Kommentar

                      Lädt...
                      X