Rafael: Mime-Typ herausfinden

Wie bekomme ich mit PHP denn bestmöglichst den MIMI-Typ einer Datei heraus? Ich weiß, dass ich mit getimagesize() den Mime-Typ von Bilddateien serviert bekomme, aber nicht für andere Formate.

Ich will nun für ein kleines Programm nur PDF-Dokumente erlauben, mich aber ungerne auf die Dateiendung der Nutzereingabe verlassen, ebenswo wenig auf den nutzergeseteuerten $_FILES-Array. Was bleibt mir da übrig?

Danke für Hilfe!

  1. Hallo Rafael,

    Wie bekomme ich mit PHP denn bestmöglichst den MIMI-Typ einer Datei heraus?

    ohne Krimi geht das nicht ;-)

    Ich will nun für ein kleines Programm nur PDF-Dokumente erlauben, mich aber ungerne auf die Dateiendung der Nutzereingabe verlassen, ebenswo wenig auf den nutzergeseteuerten $_FILES-Array. Was bleibt mir da übrig?

    a) die Fileinfo-Funktionen

    b) quick and dirty:
       Schau Dir die ersten Bytes der Datei an. Da sollte

    %PDF

    stehen.

    c) Prüfe gegen die PDF-Spezifikation.

    Freundliche Grüße

    Vinzenz

  2. Hello,

    Ich will nun für ein kleines Programm nur PDF-Dokumente erlauben, mich aber ungerne auf die Dateiendung der Nutzereingabe verlassen, ebenswo wenig auf den nutzergeseteuerten $_FILES-Array. Was bleibt mir da übrig?

    Solange Du noch http://de2.php.net/manual/en/function.mime-content-type.php zur Verfügung hast, kannst Du das benutzen. Die velinkte Klasse mit "fileinfo" ist aber nicht zu empfehlen!

    Sonst steht leider nur das Programm 'file', das auf Linux-Hosts im Zusammenhang mit dem "Magic Mime File" noch die besten Resultate liefert, zur verfügung. Für Windows gibt es das auch, ist mir aber leider beim letzten Hardware-Chrash verloren gegangen... Google könnte helfen.

    Wir haben die Funktion mal nachgebaut...

    #---------------------------------------------------------
    if(!function_exists('mime_content_type'))
    {
      function mime_content_type($filename)
      {
        $filepath = realpath($filename);
        $_mime = array();

    // Spaces werden maskiert, weil sie sonst trennen
        $filepath = str_replace(" ","\ ",$filepath);

    exec ("file -bi $filepath", $_mime, $error);

    if (($error) or (count($_mime) != 1)) return false;

    if (strpos($_mime[0], "can't stat") !== false)
        {
          $mime = "Typ unbekannt";
        }
        elseif (strpos($_mime[0], "can't read") !== false)
        {
          $mime = "Datei nicht lesbar";
        }
        elseif (strpos($_mime[0], "can't ") !== false)
        {
          $mime = "unbekannter Fehler";
        }
        else
        {
          $mime = trim($_mime[0]);
        }

    return $mime;
      }
    }
    #-------------------------------------------------------

    Du brauchst aber

    • file
    • magic_mime
    • exec

    dazu. Und die Pfade müssen passen.

    Harzliche Grüße vom Berg
    http://bergpost.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

    1. Hallo Tom,

      Ich will nun für ein kleines Programm nur PDF-Dokumente erlauben, mich aber ungerne auf die Dateiendung der Nutzereingabe verlassen, ebenswo wenig auf den nutzergeseteuerten $_FILES-Array. Was bleibt mir da übrig?

      Solange Du noch http://de2.php.net/manual/en/function.mime-content-type.php zur Verfügung hast, kannst Du das benutzen. Die velinkte Klasse mit "fileinfo" ist aber nicht zu empfehlen!

      warum? PHP ist ja anderer Ansicht.

      Für den hier vorliegenden Spezialfall prüft file übrigens auf

      0          string        %PDF-            PDF document

      5         byte          x                \b, version %c
      7         byte          x                \b.%c

      was kein Wunder ist, denn die aktuelle Spezifikation (PDF 1.7) sagt auf Seite 92:

      #--------------------------------------------------------------------------
      <zitat>
      3.4.1 File Header

      The first line of a PDF file is a header identifying the version of the PDF
      specification to which the file conforms. For a file conforming to PDF 1.7,
      the header should be

      %PDF−1.7

      However, since any file conforming to an earlier version of PDF also conforms
      to version 1.7, an application that processes PDF 1.7 can also accept files
      with any of the following headers:

      %PDF−1.0
      %PDF−1.1
      %PDF−1.2
      %PDF−1.3
      %PDF−1.4
      %PDF−1.5
      %PDF−1.6
      </zitat>
      #--------------------------------------------------------------------------

      Freundliche Grüße

      Vinzenz

      1. Hallo Vinzenz,

        ... denn die aktuelle Spezifikation (PDF 1.7) sagt auf Seite 92:

        handelt es sich um das Dokument, das du vorhin schon verlinkt hast?

        Dann wundert es mich, wieso du darin eine Seite 92 findest. Ich habe mir das rund 15MB große Dokument aus Neugier mal runtergeladen; wenn ich es öffne, hat es aber anscheinend nur eine einzige Seite. Und die sieht aus, als wäre sie das Deckblatt. Bisschen wenig für eine so große Datei, finde ich. Aber auch in der Statuszeile zeigt mein PDF Reader an: "Page 1 of 1".

        Was hast du getan, um mehr zu sehen?

        So long,
         Martin

        --
        Wenn man keine Ahnung hat - einfach mal Fresse halten.
          (Dieter Nuhr, deutscher Kabarettist)
        1. Hallo Martin,

          ... denn die aktuelle Spezifikation (PDF 1.7) sagt auf Seite 92:

          handelt es sich um das Dokument, das du vorhin schon verlinkt hast?

          ja.

          Dann wundert es mich, wieso du darin eine Seite 92 findest. Ich habe mir das rund 15MB große Dokument aus Neugier mal runtergeladen; wenn ich es öffne, hat es aber anscheinend nur eine einzige Seite. Und die sieht aus, als wäre sie das Deckblatt. Bisschen wenig für eine so große Datei, finde ich. Aber auch in der Statuszeile zeigt mein PDF Reader an: "Page 1 of 1".

          Was hast du getan, um mehr zu sehen?

          nicht Foxit-Reader, sondern den Adobe Reader verwendet :-)
          Das Dokument enthält offensichtlich noch vier weitere PDF-Dokumente, ich
          zitierte Seite 92 aus der 1310 Seiten starken pdf_reference.pdf (31.712 KB).

          Screenshot, 68kB

          Freundliche Grüße

          Vinzenz

          1. Hi Vinzenz,

            Was hast du getan, um mehr zu sehen?
            nicht Foxit-Reader, sondern den Adobe Reader verwendet :-)

            oh, dann muss ich die Leute in Sunnyvale, CA wohl mal anschreiben und fragen, wie es denn um ihrem eigenen Anspruch, eine Alternative zum Adobe Reader anzubieten, bestellt ist. Bis jetzt hatte ich jedenfalls einen sehr guten Eindruck vom Support und der User-Betreuung.

            Das Dokument enthält offensichtlich noch vier weitere PDF-Dokumente

            Ein PDF als Container für PDFs? Das dürfte dann wohl dasselbe Problem sein, warum ich mit dem Foxit Reader seit Monaten die per Mail zugestellte Telekom-Rechnung nicht mehr öffnen kann. Das heißt, die Rechnung schon, aber nicht den als zusätzlichen Dateianhang verschickten Einzelverbindungsnachweis. Den sehe ich nämlich auch nur als einseitiges PDF-Dokument mit einem großen funktionslosen Icon mitten auf der Seite.

            So long,
             Martin

            --
            Alkohl ist ungesund,
            Rauchen ist schädlich,
            Sex ist unanständig
            - und die Erde ist eine flache Scheibe.
    2. Danke, euch beiden.