Frage

Ok, also habe ich eine Datei index.php, die viele verschiedene Dateitypen zu verarbeiten hat. wie kann ich denke, den Dateityp auf der Grundlage des REQUEST_URI.

Wenn ich bitten http://site/image.jpg, und alle Anfragen umleiten durch index.php, die wie folgt aussieht

<?php
   include('/www/site'.$_SERVER['REQUEST_URI']);
?>

Wie würde ich diese Arbeit richtig zu machen?

Soll ich auf der Grundlage der Erweiterung der Datei testen angefordert, oder gibt es eine Möglichkeit, den Dateityp zu bekommen?

War es hilfreich?

Lösung

Wenn Sie sicher sind, sind Sie immer nur mit Bildern arbeiten, können Sie heraus überprüfen Sie die getimagesize () exif_imagetype () PHP-Funktion, die das Bild mime-Typen zurückzukehren versucht.

Wenn Sie keine externen Abhängigkeiten dagegen haben, können Sie auch die ausgezeichnete getID3 überprüfen -Bibliothek, die die bestimmen kann, Mime-Typ von vielen verschiedenen Dateitypen.

Schließlich können Sie überprüfen die mime_content_type () Funktion - aber es hat sich für die Fileinfo PECL-Erweiterung veraltet.

Andere Tipps

mime_content_type () ist veraltet, so dass Sie auch in Zukunft zählen können, um daran zu arbeiten nicht. Es gibt eine „Dateiinfo“ PECL-Erweiterung, aber ich habe nicht gute Dinge über sie gehört.

Wenn Sie auf einem * nix-Server ausgeführt werden, können Sie die folgende tun, was gut für mich gearbeitet hat:

$file = escapeshellarg( $filename );
$mime = shell_exec("file -bi " . $file);
$filename should probably include the absolute path.
function get_mime($file) {
  if (function_exists("finfo_file")) {
    $finfo = finfo_open(FILEINFO_MIME_TYPE); // return mime type ala mimetype extension
    $mime = finfo_file($finfo, $file);
    finfo_close($finfo);
    return $mime;
  } else if (function_exists("mime_content_type")) {
    return mime_content_type($file);
  } else if (!stristr(ini_get("disable_functions"), "shell_exec")) {
    // http://stackoverflow.com/a/134930/1593459
    $file = escapeshellarg($file);
    $mime = shell_exec("file -bi " . $file);
    return $mime;
  } else {
    return false;
  }
}

Für mich nichts davon funktioniert -. mime_content_type ist veraltet, finfo nicht installiert ist, und shell_exec ist nicht erlaubt

Ich habe tatsächlich durch den Mangel an satt Standard MIME-Methoden in PHP Sniffing. Installieren Sie fileinfo ... Verwenden veraltete Funktionen ... Oh diese Arbeit, aber nur für die Bilder! Ich stand auf der es zugeführt wird, so habe ich einige der Forschung und fand die WHATWG Mimesniffing spec - Ich glaube, das noch ein Entwurf ist, obwohl spec.

Wie auch immer, mit dieser Spezifikation, konnte ich eine mimesniffer in PHP implementieren. Die Leistung ist kein Problem. In der Tat auf meiner bescheidenen Maschine konnte ich Tausende von Dateien öffnen und zu beschnuppern, bevor PHP abgelaufen.

Hier ist der MimeReader Klasse .

require_once("MimeReader.php");

$mime = new MimeReader(<YOUR FILE PATH>);
$mime_type_string = $mime->getType();     // "image/jpeg" etc.

Wenn Sie mit Bildern arbeiten nur, und Sie müssen Mime-Typen (zum Beispiel für Header), dann ist dies die schnellste und direkteste Antwort:

$file = 'path/to/image.jpg';
$image_mime = image_type_to_mime_type(exif_imagetype($file));

Es wird Ausgang wahren Bild MIME-Typen, auch wenn Sie Ihre Image-Datei umbenennen

Nach dem PHP-Handbuch, die finfo-Datei Funktion ist beste Weg, dies zu tun. Allerdings müssen Sie die Fileinfo PECL-Erweiterung installieren.

Wenn die Erweiterung nicht möglich ist, können Sie die veraltete mime_content_type Funktion.

mime_content_type() erscheint der Weg, um zu gehen, ungeachtet der obigen Ausführungen sagen, es ist veraltet. Es ist nicht - oder zumindest diese Inkarnation mime_content_type() nicht veraltet ist, nach http://php.net/manual/en/function.mime-content-type.php . Es ist Teil der Fileinfo-Erweiterung, aber die PHP-Dokumentation sagt uns jetzt, es ist standardmäßig als PHP 5.3.0 aktiviert ist.

Sie können mit finfo dies zu erreichen, wie von PHP 5.3:

<?php
$info = new finfo(FILEINFO_MIME_TYPE);
echo $info->file('myImage.jpg');
// prints "image/jpeg"

Die FILEINFO_MIME_TYPE Flagge ist optional; ohne sie erhalten Sie eine ausführlichere Zeichenfolge für einige Dateien; (Anscheinend einige Bildtypen zurückkehren Größe und Farbtiefe Information). Unter Verwendung der FILEINFO_MIME Flag gibt den MIME-Typ und die Kodierung, falls verfügbar (z.B. image / PNG; charset = binary oder text / x-php; charset = US-ASCII). Siehe diese Seite für weitere Informationen.

Ich habe es nicht benutzt, aber es gibt ein PECL-Erweiterung eine Datei MIME-Typen bekommen . Die offizielle Dokumentation ist in das Handbuch .

Je nach Zweck, eine Dateierweiterung kann in Ordnung sein, aber es ist nicht unglaublich zuverlässig, da es so leicht geändert werden.

Ich habe sehr gute Ergebnisse mit einer Benutzerfunktion aus http://php.net/manual/de/function.mime-content -type.php @ '' John dot bei prismmg dot com 26-Oct-2009 03.43 howard ''

function get_mime_type($filename, $mimePath = '../etc') { ...

die Verwendung finfo, exec oder veraltet Funktion

tut

funktioniert gut auch mit Remote-Ressourcen!

, wenn Sie nur mit Bildern zu tun können Sie die [getimagesize()][1] Funktion benutzen, die alle Arten von Informationen über das Bild enthält, einschließlich der Art.

Ein allgemeinerer Ansatz wäre, die Fileinfo-Erweiterung von PECL zu verwenden. : http: //us.php Die PHP-Dokumentation für diese Erweiterung finden Sie unter .net / manual / en / ref.fileinfo.php

Einige Leute haben ernsthafte Beschwerden über diese Erweiterung ... also, wenn Sie in ernsthafte Probleme auftreten oder die Erweiterung aus irgendeinem Grund nicht installieren Sie könnten die veraltete Funktion mime_content_type()

Wenn Sie Linux ausführen und haben die Erweiterung, die Sie einfach den MIME-Typen von /etc/mime.types, indem eine Hash-Array lesen können. Anschließend können Sie das Speichern im Speicher und einfach den MIME von Array-Schlüssel nennen:)

/**
 * Helper function to extract all mime types from the default Linux /etc/mime.types
 */
function get_mime_types() {
    $mime_types = array();
    if (
        file_exists('/etc/mime.types') &&
        ($fh = fopen('/etc/mime.types', 'r')) !== false
    ) {
        while (($line = fgets($fh)) !== false) {
            if (!trim($line) || substr($line, 0, 1) === '#') continue;
            $mime_type = preg_split('/\t+/', rtrim($line));
            if (
                is_array($mime_type) &&
                isset($mime_type[0]) && $mime_type[0] &&
                isset($mime_type[1]) && $mime_type[1]
            ) {
                foreach (explode(' ', $mime_type[1]) as $ext) {
                    $mime_types[$ext] = $mime_type[0];
                }
            }
        }
        fclose($fh);
    }
    return $mime_types;
}

Der Mime jeder Datei auf Ihrem Server mit diesem geholt werden kann

<?php
function get_mime($file_path){
  $finfo = new finfo(FILEINFO_MIME_TYPE);
  $type  = $finfo->file(file_path);
}

$mime = get_mime('path/to/file.ext');
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top