it-swarm.com.de

Wie bekomme ich den Inhaltstyp einer Datei in PHP?

Ich benutze PHP, um eine E-Mail mit einem Anhang zu senden. Der Anhang kann aus verschiedenen Dateitypen bestehen (pdf, txt, doc, swf usw.).

Zuerst ruft das Skript die Datei mit "file_get_contents" ab.

Später gibt das Skript Folgendes in der Kopfzeile wieder:

Content-Type: <?php echo $the_content_type; ?>; name="<?php echo $the_file_name; ?>"

Wie setze ich den korrekten Wert für $ the_content_type ?

17
edt

Ich verwende diese Funktion, die mehrere Fallbacks enthält, um ältere Versionen von PHP oder einfach schlechte Ergebnisse auszugleichen:

function getFileMimeType($file) {
    if (function_exists('finfo_file')) {
        $finfo = finfo_open(FILEINFO_MIME_TYPE);
        $type = finfo_file($finfo, $file);
        finfo_close($finfo);
    } else {
        require_once 'upgradephp/ext/mime.php';
        $type = mime_content_type($file);
    }

    if (!$type || in_array($type, array('application/octet-stream', 'text/plain'))) {
        $secondOpinion = exec('file -b --mime-type ' . escapeshellarg($file), $foo, $returnCode);
        if ($returnCode === 0 && $secondOpinion) {
            $type = $secondOpinion;
        }
    }

    if (!$type || in_array($type, array('application/octet-stream', 'text/plain'))) {
        require_once 'upgradephp/ext/mime.php';
        $exifImageType = exif_imagetype($file);
        if ($exifImageType !== false) {
            $type = image_type_to_mime_type($exifImageType);
        }
    }

    return $type;
}

Es wird versucht, die neueren PHP finfo-Funktionen zu verwenden. Wenn diese nicht verfügbar sind, verwendet sie die mime_content_type-Alternative und enthält die Drop-In-Ersetzung aus der Bibliothek Upgrade.php , um sicherzustellen, dass dies vorhanden ist. Wenn diese nichts nützliches zurückgegeben haben, wird der Befehl file des Betriebssystems verwendet. AFAIK ist nur auf * NIX-Systemen verfügbar. Möglicherweise möchten Sie dies ändern oder entfernen, wenn Sie beabsichtigen, dies unter Windows zu verwenden. Wenn nichts funktioniert hat, wird exif_imagetype als Fallback nur für Bilder versucht.

Ich habe festgestellt, dass die verschiedenen Server in ihrer Unterstützung für die MIME-Funktionen sehr unterschiedlich sind und der Upgrade.php mime_content_type-Ersatz bei weitem nicht perfekt ist. Die begrenzten exif_imagetype-Funktionen, sowohl das Original als auch der Upgrade.php-Ersatz, funktionieren jedoch ziemlich zuverlässig. Wenn Sie sich nur um Bilder kümmern, möchten Sie möglicherweise nur das letzte Bild verwenden.

26
deceze
6
Quentin

Es ist sehr leicht, es in PHP zu haben.

Rufen Sie einfach die folgende PHP-Funktion auf mime_content_type

<?php
    $filelink= 'uploads/some_file.pdf';
    $the_content_type = "";

    // check if the file exist before
    if(is_file($file_link)) {
        $the_content_type = mime_content_type($file_link);
    }
    // You can now use it here.

?>

PHP Dokumentation der Funktion mime_content_type () Hoffe es hilft jemandem

5
BoCyrill

Hier ist ein Beispiel mit finfo_open , das in PHP5 und PECL verfügbar ist:

$mimepath='/usr/share/magic'; // may differ depending on your machine
// try /usr/share/file/magic if it doesn't work
$mime = finfo_open(FILEINFO_MIME,$mimepath);
if ($mime===FALSE) {
 throw new Exception('Unable to open finfo');
}
$filetype = finfo_file($mime,$tmpFileName);
finfo_close($mime);
if ($filetype===FALSE) {
 throw new Exception('Unable to recognise filetype');
}

Alternativ können Sie die Funktion deprecated mime_ content_ type verwenden:

$filetype=mime_content_type($tmpFileName);

oder verwenden Sie die Betriebssysteme in eingebauten Funktionen:

ob_start();
system('/usr/bin/file -i -b ' . realpath($tmpFileName));
$type = ob_get_clean();
$parts = explode(';', $type);
$filetype=trim($parts[0]);
4
Richy B.
function getMimeType( $filename ) {
        $realpath = realpath( $filename );
        if ( $realpath
                && function_exists( 'finfo_file' )
                && function_exists( 'finfo_open' )
                && defined( 'FILEINFO_MIME_TYPE' )
        ) {
                // Use the Fileinfo PECL extension (PHP 5.3+)
                return finfo_file( finfo_open( FILEINFO_MIME_TYPE ), $realpath );
        }
        if ( function_exists( 'mime_content_type' ) ) {
                // Deprecated in PHP 5.3
                return mime_content_type( $realpath );
        }
        return false;
}

Das hat für mich funktioniert

Warum ist mime_content_type () in PHP veraltet?

2
George

Ich glaube, ich habe einen kurzen Weg gefunden. Ermitteln Sie die Bildgröße mit:

$infFil=getimagesize($the_file_name);

und

Content-Type: <?php echo $infFil["mime"] ?>; name="<?php echo $the_file_name; ?>"

Die Variable getimagesize gibt ein assoziatives Array mit einem MIME-Schlüssel zurück

Ich habe es benutzt und es funktioniert

0
user3348274

Ich habe die meisten Vorschläge ausprobiert, aber alle scheitern bei mir (ich bin anscheinend zwischen jeder nützlichen Version von PHP). Ich hatte die folgende Funktion:

function getShellFileMimetype($file) {
    $type = Shell_exec('file -i -b '. escapeshellcmd( realpath($_SERVER['DOCUMENT_ROOT'].$file)) );
    if( strpos($type, ";")!==false ){
        $type = current(explode(";", $type));
    }
    return $type;
}
0
Martijn