Mime-Typ herausfinden
Rafael
- php
0 Vinzenz Mai0 Tom0 Vinzenz Mai0 Rafael
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!
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
stehen.
c) Prüfe gegen die PDF-Spezifikation.
Freundliche Grüße
Vinzenz
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
dazu. Und die Pfade müssen passen.
Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de
Tom
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
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
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).
Freundliche Grüße
Vinzenz
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
Danke, euch beiden.