如何在PHP中获取文件的内容types?

我正在使用PHP发送附件的电子邮件。 附件可以是几种不同文件types(pdf,txt,doc,swf等)中的任何一种。

首先,脚本使用“file_get_contents”获取文件。

之后,脚本在标题中回响:

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

如何为$ the_content_type设置正确的值?

我正在使用这个function,其中包括几个回退,以补偿旧版本的PHP或只是坏的结果:

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

它试图使用较新的PHP finfo函数。 如果这些不可用,它将使用mime_content_type替代scheme,并包含来自Upgrade.php库的插入replace,以确保它存在。 如果那些没有返回任何有用的东西,它会尝试操作系统的file命令。 AFAIK只适用于* NIX系统,如果您打算在Windows上使用它,您可能需要更改或删除它。 如果没有任何工作,它exif_imagetype尝试exif_imagetype作为后备图像。

我已经注意到,不同的服务器对mimetypes函数的支持差别很大,而且Upgrade.php mime_content_typereplace远非完美。 有限的exif_imagetype函数,原来的和Upgrade.phpreplace,虽然工作相当可靠。 如果你只关心图像,你可能只想使用这最后一个。

用finfo_file: http ://us2.php.net/manual/en/function.finfo-file.php

下面是一个使用PHP5和PECL中的finfo_open的例子:

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

或者,您可以使用已弃用的 mime_ content_type函数:

 $filetype=mime_content_type($tmpFileName); 

或者在构build的function中使用操作系统:

 ob_start(); system('/usr/bin/file -i -b ' . realpath($tmpFileName)); $type = ob_get_clean(); $parts = explode(';', $type); $filetype=trim($parts[0]); 

它很容易在PHP中。

只需调用下面的php函数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. ?> 

函数mime_content_type()的PHP文档希望它可以帮助某人

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

这对我有效

为什么在PHP中不推荐使用mime_content_type()?

我想我发现了一个简短的方法。 使用以下命令获取图像大小

$infFil=getimagesize($the_file_name);

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

getimagesize返回一个有MIME键的关联数组

我用它,它的工作原理

我已经尝试了大部分的build议,但是他们都失败了(我在中间的任何有用的PHP版本中,我最终得到了以下function:

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

有function标题:

  header('Content-Type: '.$the_content_type); 

请注意,此function必须任何输出之前调用。 你可以在参考http://php.net/header中find更多的细节;

编辑:

操作系统,我误解了这个问题:由于PHP 4.0有functionmime_content_type来检测文件的MIMEtypes。

在PHP 5中被弃用,应该被函数的文件信息集所取代。

我真的推荐使用像“CodeIgniter”这样的框架来closures电子邮件。 以下是关于“仅使用CodeIgniter发送电子邮件”的截屏。

http://net.tutsplus.com/videos/screencasts/codeigniter-from-scratch-day-3/

尝试这个:

 function ftype($f) { curl_setopt_array(($c = @curl_init((!preg_match("/[az]+:\/{2}(?:www\.)?/i",$f) ? sprintf("%s://%s/%s", "http" , $_SERVER['HTTP_HOST'],$f) : $f))), array(CURLOPT_RETURNTRANSFER => 1, CURLOPT_HEADER => 1)); return(preg_match("/Type:\s*(?<mime_type>[^\n]+)/i", @curl_exec($c), $m) && curl_getinfo($c, CURLINFO_HTTP_CODE) != 404) ? ($m["mime_type"]) : 0; } echo ftype("http://img2.orkut.comhttp://img.dovov.commedium/1283204135/604747203/ln.jpg"); // print image/jpeg