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 ?
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.
Avec finfo_file: http://us2.php.net/manual/en/function.finfo-file.php
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
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]);
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
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;
}