web-dev-qa-db-fra.com

Comment obtenir le type de contenu d'un fichier en PHP?

J'utilise PHP pour envoyer un courrier électronique avec une pièce jointe. La pièce jointe peut être un type de fichier différent (pdf, txt, doc, swf, etc.).

Tout d'abord, le script récupère le fichier en utilisant "file_get_contents".

Plus tard, le script résonne dans l'en-tête:

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

Comment définir la valeur correcte pour $ the_content_type ?

17
edt

J'utilise cette fonction, qui inclut plusieurs solutions de repli pour compenser les anciennes versions de PHP ou tout simplement de mauvais résultats:

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;
}

Il essaie d'utiliser les nouvelles fonctions PHP finfo. Si ceux-ci ne sont pas disponibles, il utilise l'alternative mime_content_type et inclut le remplacement immédiat à partir de Upgrade.php library pour s'assurer que cela existe. Si ceux-ci ne renvoient rien d’utile, nous allons essayer la commande file du système d’exploitation. Autant que je sache, disponible uniquement sur les systèmes * NIX, vous pouvez modifier ou supprimer cette fonctionnalité si vous envisagez de l’utiliser sous Windows. Si rien ne fonctionne, exif_imagetype est utilisé comme solution de secours pour les images uniquement.

J'ai remarqué que la prise en charge des fonctions de type mime varie considérablement d'un serveur à l'autre et que le remplacement de Upgrade.php mime_content_type est loin d'être parfait. Cependant, les fonctions limitées exif_imagetype, l’original et le remplacement de Upgrade.php, fonctionnent de manière assez fiable. Si vous ne vous souciez que des images, vous pouvez utiliser uniquement cette dernière.

26
deceze
6
Quentin

C'est très facile de l'avoir en php.

Appelez simplement la fonction php suivante 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 documentation de la fonction mime_content_type () J'espère que cela aidera quelqu'un

5
BoCyrill

Voici un exemple utilisant finfo_open qui est disponible dans PHP5 et PECL:

$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');
}

Vous pouvez également utiliser la fonction deprecatedmime_ content_ type /:

$filetype=mime_content_type($tmpFileName);

ou utiliser les fonctions intégrées du système d'exploitation:

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;
}

Cela a fonctionné pour moi

Pourquoi mime_content_type () est obsolète en PHP?

2
George

J'ai essayé la plupart des suggestions, mais elles ont toutes échoué pour moi (je suis apparemment entre toutes les versions utiles de PHP. Je me suis retrouvé avec la fonction suivante:

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