Motzi: überprüfen ob Datei vorhanden und Endung ermitteln

Ich möchte vor dem Ausgeben einer Datei prüfen ob es diese auch gibt. es gibt diese nur einmal, es können aber verschiedene Endnungen sein, wie zip, pdf, jpg

Wenn ich eine überprüfe wo ich die Endung kenne, bekomme ich das mit

if (file_exists('100.zip'))

hin,

ich möchte aber überprüfen, ob es eine Datei mit 100 gibt und dann die Endung ausgeben.

Also abfragen ob 100 vorhanden ist, und welche Endung es hat.

Weis jemand wie ich das machen kann?

Motzi

  1. @@Motzi:

    nuqneH

    Ich möchte vor dem Ausgeben einer Datei prüfen ob es diese auch gibt. es gibt diese nur einmal, es können aber verschiedene Endnungen sein, wie zip, pdf, jpg

    Warum willst du das prüfen? Löst vielleicht MultiViews dein Problem?

    Qapla'

    --
    „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
  2. Moin,

    Also abfragen ob 100 vorhanden ist, und welche Endung es hat.

    Du suchst die glob()-Funktion. Diese gibt dir alle Dateien nach einem Muster zurück. Die Endungen kannst du per substr() und strrpos() herausfinden.

    Grüße Marco

    --
    Ich spreche Spaghetticode - fließend.
    1. Super das glob wars, aber jetzt hab ich noch ein Problem das vorher auftritt.

      wenn ich abspeicher, will ich den Namen ändern, aber nicht die Endung.

      also aus xxxxxxxxx.zip soll 100.zip, bzw. aus xxxxxxxxxxxxx.doc soll 100.doc werden

      if( is_uploaded_file ( $_FILES['userfile_doc']['tmp_name'] ) )
      {

      $endung <---

      move_uploaded_file($_FILES['userfile_doc']['tmp_name'], 'verzeichnis/100.'.$endnung);
      }

      wie bekommt die var $endung die endnung $_FILES['userfile_doc']['tmp_name']

      Motzi

      1. Moin,

        wie bekommt die var $endung die endnung $_FILES['userfile_doc']['tmp_name']

        // ungetestet  
        $endung = substr($_FILES['userfile_doc']['tmp_name'], strrpos($_FILES['userfile_doc']['tmp_name'], "."));
        

        Aber das ist nur ein Beispiel. Es funktioniert nicht, wenn der Dateiname keinen Punkt enthält. Darauf musst du noch prüfen und den Fall entsprechend behandeln.

        Grüße Marco

        --
        Ich spreche Spaghetticode - fließend.
        1. Hello,

          wie bekommt die var $endung die endnung $_FILES['userfile_doc']['tmp_name']

          Das hat keine Endung.
          Eine Endung hat nur $_FILES['userfile_doc']['name'].
          Das ist der Name, den der Benutzer dem Upload mitgibt.

          Erstmal schneidet man tunlichst den Dateinamen raus aus dem Pfad

            
          $filename = basename($_FILES['userfile_doc']['name']);  
          
          

          Und dann kann man mittels der Funktion pathinfo()
          http://de3.php.net/manual/en/function.pathinfo.php
          Die Zerlegung betreiben.

          Da aber die Endung für den vollständigen Filenamen nur eine Lüge des Users ist, ist diese sowiewso ziemlich wertlos. Da kann sich hinter einem "mein_bild.jpg" durchaus ein PHP-Script oder sonstige Gemeinheiten verstecken.

          Bitte achtet darauf, dass Ihr keine Files unter dem "Originalnamen", den der User mit hochlädt, in Euer Dateisystem speichert. Da könnte dann ebenfalls schon mal ein Script, oder eine '.htaccess' dabei sein!

          Außerdem sollte das Verzeichnis, in dem die Files geparkt werden, entweder außerhalb der DOCUMENT-ROOT liegen, oder mindestens die PHP-Engine abgeschaltet werden:

          #.htaccess
              php_value engine o

          Die .htaccess-Datei sollte tunlichst NICHT durch PHP-Scripte (also den Webserver selber) beschreibbar sein!

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
           ☻_
          /▌
          / \ Nur selber lernen macht schlau
          http://bikers-lodge.com
      2. Hello,

        ich sehe schon, das ist der falsche Weg.

        Super das glob wars, aber jetzt hab ich noch ein Problem das vorher auftritt.

        wenn ich abspeicher, will ich den Namen ändern, aber nicht die Endung.

        also aus xxxxxxxxx.zip soll 100.zip, bzw. aus xxxxxxxxxxxxx.doc soll 100.doc werden

        if( is_uploaded_file ( $_FILES['userfile_doc']['tmp_name'] ) )
        {

        $endung <---

        move_uploaded_file($_FILES['userfile_doc']['tmp_name'], 'verzeichnis/100.'.$endnung);
        }

        wie bekommt die var $endung die endnung $_FILES['userfile_doc']['tmp_name']

        Unabhängig davon, dass noch die alte Geschichte mit "is_uploded_file()" offen ist...

        das ist mMn antiquiert, seit es $_FILES gibt,
        sollte man

          
        if ($_FILES['uploadname'][$error] === 0) fragen.  
        
        

        wenn ein (1) File als Upload erwartet wird.

        Zum Übertragen der Datei aus dem hoffentlich für jede Domain getrennt angelegten upload_tmp_dir http://de3.php.net/manual/en/ini.core.php#ini.upload-tmp-dir
        sollte man die Datei nicht mit move_uploaded_file() verschieben (ebenfalls antiquiert), da es keinerlei Rücksicht auf das Vorhandensein des Zieles nimmt.

        Besser

        Quellfile öffnen
        Quellfile sperren (shared reicht)

        Zielfile öffnen mit Arrtibut (xb), wenn man nachher sofort lesen will mit (xb+)
        Wenn das schief geht, war das File schon da und man muss eben mit anderem Namen
        nochmal probieren. (*)
        Zielfile sperren (exclusive)
        Daten aus dem Quellfile ins Zielfile übertragen

        Beide Files wieder schließen.

        Das TMP-File verschwindet beim Scriptende automatisch, obwohl es _keine__echte__Temporärdatei ist. Das übernimmt abe PHP.

        http://de3.php.net/manual/en/function.fopen.php

        Du schaffst Du sonst an ein bis zwei Stellen ein TOCTTOU-Problem.
        https://de.wikipedia.org/wiki/Time-of-Check-to-Time-of-Use-Problem

        (*) noch ein Tipp zur Güte:
        Vermutlich benutzt Du ja eine Datenbank, um deine Daten zu verwalten. Wenn Du nun jeder Datei einen Datensatz in einer Tabelle mit Primary-Key zuordnest, in dem der Eigentümer, Upload-Datum, Größe, der MIME-Type, die Endung, usw. gespeichert werden, dann kannst Du die abgelegte Datei im Dateisystem einfach "$id.$extension" nennen und alles wird gut.

        Den MIME-Type entnimmst Du bitte nicht dem $_FILES-Array, sondern bestimmst ihn mit der Funktion:

        function get_mime_type($path)
        {
        $_version = explode('.',phpversion());
        if (($_version[0] < 5) or (($_version[0] == 5) and ($_version[1] < 3))) return false;
        if (!function_exists('finfo_open')) return false;

        if (!$finfo = finfo\_open(FILEINFO\_MIME\_TYPE)) return false;  
        $mime\_type = finfo\_file($finfo, $path);  
        finfo\_close($finfo);	  
        
        return $mime\_type;  
        

        }

        siehe auch im SelfHTMT-Wiki unter "Fileupload". Das Wiki steht aber im Moment.

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bikers-lodge.com
        1. Om nah hoo pez nyeetz, Tom!

          siehe auch im SelfHTMT-Wiki unter "Fileupload". Das Wiki steht aber im Moment.

          Ich reiche mal den Link nach. http://wiki.selfhtml.org/wiki/Artikel:PHP/File_Upload

          Matthias

          --
          Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Arsen und Arsenal.