2010-08-19 45 views
7

我有一个名为Prestashop的电子商务软件包。 它们允许您销售虚拟产品,可下载的项目,如软件,电子书等。在PHP中使用NO FILE EXTENSION获取MIME类型

他们的软件有问题,他们将可下载产品的物理文件名命名为40字符散列没有扩展。然后,当客户下载文件时,系统应该检查MIME类型,以便在将文件发送到客户浏览器之前将其设置在标题中。

这里存在问题。他们使用四种方法来确定MIME类型。

  1. finfo_open()函数,这个扩展恰好没有安装在我的主机上,所以它失败了。
  2. mime_content_type()函数,它接受没有扩展名的文件,并返回一个'text/plain'MIME类型,不管MIME类型实际是什么。这个功能已被弃用,我的想法是他们不应该使用它。
  3. exec('file -bi '.escapeshellarg($file))。这也会在我的主机上失败。
  4. 与MIME类型匹配的扩展数组。

我很难理解这一点,因为他们将文件命名为文件,而将它添加到后台时没有扩展名。我很难看到这一切始终有效。

我已经尝试了很多其他的修复,包括从卷曲调用获取CURLINFO_CONTENT_TYPE下载文件,顺便说一句,该文件顺便为同一个文件返回'text/plain'。

任何有关如何解决此问题的想法?

解决方案使用...

if (empty($mime_type)) 
{ 
    $bName = basename($filename); 
    $bName = explode('.', $bName); 
    $bName = strtolower($bName[count($bName) - 1]); 

    $mimeTypes = array(
    'ez'  => 'application/andrew-inset', 
    'atom'  => 'application/atom+xml', 
    'jar'  => 'application/java-archive', 
    'hqx'  => 'application/mac-binhex40', 
    'cpt'  => 'application/mac-compactpro', 
    'mathml' => 'application/mathml+xml', 
    'doc'  => 'application/msword', 
    'dat'  => 'application/octet-stream', 
    'oda'  => 'application/oda', 
    'ogg'  => 'application/ogg', 
    'pdf'  => 'application/pdf', 
    'ai'  => 'application/postscript', 
    'eps'  => 'application/postscript', 
    'ps'  => 'application/postscript', 
    'rdf'  => 'application/rdf+xml', 
    'rss'  => 'application/rss+xml', 
    'smi'  => 'application/smil', 
    'smil'  => 'application/smil', 
    'gram'  => 'application/srgs', 
    'grxml'  => 'application/srgs+xml', 
    'kml'  => 'application/vnd.google-earth.kml+xml', 
    'kmz'  => 'application/vnd.google-earth.kmz', 
    'mif'  => 'application/vnd.mif', 
    'xul'  => 'application/vnd.mozilla.xul+xml', 
    'xls'  => 'application/vnd.ms-excel', 
    'xlb'  => 'application/vnd.ms-excel', 
    'xlt'  => 'application/vnd.ms-excel', 
    'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12', 
    'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12', 
    'xlsm'  => 'application/vnd.ms-excel.sheet.macroEnabled.12', 
    'xltm'  => 'application/vnd.ms-excel.template.macroEnabled.12', 
    'docm'  => 'application/vnd.ms-word.document.macroEnabled.12', 
    'dotm'  => 'application/vnd.ms-word.template.macroEnabled.12', 
    'ppam'  => 'application/vnd.ms-powerpoint.addin.macroEnabled.12', 
    'pptm'  => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12', 
    'ppsm'  => 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12', 
    'potm'  => 'application/vnd.ms-powerpoint.template.macroEnabled.12', 
    'ppt'  => 'application/vnd.ms-powerpoint', 
    'pps'  => 'application/vnd.ms-powerpoint', 
    'odc'  => 'application/vnd.oasis.opendocument.chart', 
    'odb'  => 'application/vnd.oasis.opendocument.database', 
    'odf'  => 'application/vnd.oasis.opendocument.formula', 
    'odg'  => 'application/vnd.oasis.opendocument.graphics', 
    'otg'  => 'application/vnd.oasis.opendocument.graphics-template', 
    'odi'  => 'application/vnd.oasis.opendocument.image', 
    'odp'  => 'application/vnd.oasis.opendocument.presentation', 
    'otp'  => 'application/vnd.oasis.opendocument.presentation-template', 
    'ods'  => 'application/vnd.oasis.opendocument.spreadsheet', 
    'ots'  => 'application/vnd.oasis.opendocument.spreadsheet-template', 
    'odt'  => 'application/vnd.oasis.opendocument.text', 
    'odm'  => 'application/vnd.oasis.opendocument.text-master', 
    'ott'  => 'application/vnd.oasis.opendocument.text-template', 
    'oth'  => 'application/vnd.oasis.opendocument.text-web', 
    'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template', 
    'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', 
    'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 
    'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 
    'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', 
    'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 
    'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template', 
    'vsd'  => 'application/vnd.visio', 
    'wbxml'  => 'application/vnd.wap.wbxml', 
    'wmlc'  => 'application/vnd.wap.wmlc', 
    'wmlsc'  => 'application/vnd.wap.wmlscriptc', 
    'vxml'  => 'application/voicexml+xml', 
    'bcpio'  => 'application/x-bcpio', 
    'vcd'  => 'application/x-cdlink', 
    'pgn'  => 'application/x-chess-pgn', 
    'cpio'  => 'application/x-cpio', 
    'csh'  => 'application/x-csh', 
    'dcr'  => 'application/x-director', 
    'dir'  => 'application/x-director', 
    'dxr'  => 'application/x-director', 
    'dvi'  => 'application/x-dvi', 
    'spl'  => 'application/x-futuresplash', 
    'tgz'  => 'application/x-gtar', 
    'gtar'  => 'application/x-gtar', 
    'hdf'  => 'application/x-hdf', 
    'js'  => 'application/x-javascript', 
    'skp'  => 'application/x-koan', 
    'skd'  => 'application/x-koan', 
    'skt'  => 'application/x-koan', 
    'skm'  => 'application/x-koan', 
    'latex'  => 'application/x-latex', 
    'nc'  => 'application/x-netcdf', 
    'cdf'  => 'application/x-netcdf', 
    'sh'  => 'application/x-sh', 
    'shar'  => 'application/x-shar', 
    'swf'  => 'application/x-shockwave-flash', 
    'sit'  => 'application/x-stuffit', 
    'sv4cpio' => 'application/x-sv4cpio', 
    'sv4crc' => 'application/x-sv4crc', 
    'tar'  => 'application/x-tar', 
    'tcl'  => 'application/x-tcl', 
    'tex'  => 'application/x-tex', 
    'texinfo' => 'application/x-texinfo', 
    'texi'  => 'application/x-texinfo', 
    't'   => 'application/x-troff', 
    'tr'  => 'application/x-troff', 
    'roff'  => 'application/x-troff', 
    'man'  => 'application/x-troff-man', 
    'me'  => 'application/x-troff-me', 
    'ms'  => 'application/x-troff-ms', 
    'ustar'  => 'application/x-ustar', 
    'src'  => 'application/x-wais-source', 
    'xhtml'  => 'application/xhtml+xml', 
    'xht'  => 'application/xhtml+xml', 
    'xslt'  => 'application/xslt+xml', 
    'xml'  => 'application/xml', 
    'xsl'  => 'application/xml', 
    'dtd'  => 'application/xml-dtd', 
    'zip'  => 'application/zip', 
    'au'  => 'audio/basic', 
    'snd'  => 'audio/basic', 
    'mid'  => 'audio/midi', 
    'midi'  => 'audio/midi', 
    'kar'  => 'audio/midi', 
    'mpga'  => 'audio/mpeg', 
    'mp2'  => 'audio/mpeg', 
    'mp3'  => 'audio/mpeg', 
    'aif'  => 'audio/x-aiff', 
    'aiff'  => 'audio/x-aiff', 
    'aifc'  => 'audio/x-aiff', 
    'm3u'  => 'audio/x-mpegurl', 
    'wma'  => 'audio/x-ms-wma', 
    'wax'  => 'audio/x-ms-wax', 
    'ram'  => 'audio/x-pn-realaudio', 
    'ra'  => 'audio/x-pn-realaudio', 
    'rm'  => 'application/vnd.rn-realmedia', 
    'wav'  => 'audio/x-wav', 
    'pdb'  => 'chemical/x-pdb', 
    'xyz'  => 'chemical/x-xyz', 
    'bmp'  => 'image/bmp', 
    'cgm'  => 'image/cgm', 
    'gif'  => 'image/gif', 
    'ief'  => 'image/ief', 
    'jpeg'  => 'image/jpeg', 
    'jpg'  => 'image/jpeg', 
    'jpe'  => 'image/jpeg', 
    'png'  => 'image/png', 
    'svg'  => 'image/svg+xml', 
    'tiff'  => 'image/tiff', 
    'tif'  => 'image/tiff', 
    'djvu'  => 'image/vnd.djvu', 
    'djv'  => 'image/vnd.djvu', 
    'wbmp'  => 'image/vnd.wap.wbmp', 
    'ras'  => 'image/x-cmu-raster', 
    'ico'  => 'image/x-icon', 
    'pnm'  => 'image/x-portable-anymap', 
    'pbm'  => 'image/x-portable-bitmap', 
    'pgm'  => 'image/x-portable-graymap', 
    'ppm'  => 'image/x-portable-pixmap', 
    'rgb'  => 'image/x-rgb', 
    'xbm'  => 'image/x-xbitmap', 
    'psd'  => 'image/x-photoshop', 
    'xpm'  => 'image/x-xpixmap', 
    'xwd'  => 'image/x-xwindowdump', 
    'eml'  => 'message/rfc822', 
    'igs'  => 'model/iges', 
    'iges'  => 'model/iges', 
    'msh'  => 'model/mesh', 
    'mesh'  => 'model/mesh', 
    'silo'  => 'model/mesh', 
    'wrl'  => 'model/vrml', 
    'vrml'  => 'model/vrml', 
    'ics'  => 'text/calendar', 
    'ifb'  => 'text/calendar', 
    'css'  => 'text/css', 
    'csv'  => 'text/csv', 
    'html'  => 'text/html', 
    'htm'  => 'text/html', 
    'txt'  => 'text/plain', 
    'asc'  => 'text/plain', 
    'rtx'  => 'text/richtext', 
    'rtf'  => 'text/rtf', 
    'sgml'  => 'text/sgml', 
    'sgm'  => 'text/sgml', 
    'tsv'  => 'text/tab-separated-values', 
    'wml'  => 'text/vnd.wap.wml', 
    'wmls'  => 'text/vnd.wap.wmlscript', 
    'etx'  => 'text/x-setext', 
    'mpeg'  => 'video/mpeg', 
    'mpg'  => 'video/mpeg', 
    'mpe'  => 'video/mpeg', 
    'qt'  => 'video/quicktime', 
    'mov'  => 'video/quicktime', 
    'mxu'  => 'video/vnd.mpegurl', 
    'm4u'  => 'video/vnd.mpegurl', 
    'flv'  => 'video/x-flv', 
    'asf'  => 'video/x-ms-asf', 
    'asx'  => 'video/x-ms-asf', 
    'wmv'  => 'video/x-ms-wmv', 
    'wm'  => 'video/x-ms-wm', 
    'wmx'  => 'video/x-ms-wmx', 
    'avi'  => 'video/x-msvideo', 
    'ogv'  => 'video/ogg', 
    'movie'  => 'video/x-sgi-movie', 
    'ice'  => 'x-conference/x-cooltalk'); 
    if (isset($mimeTypes[$bName])) 
     $mime_type = $mimeTypes[$bName]; 
    else 
     $mime_type = 'application/octet-stream'; 
} 
+0

顺便说一句,我的所有下载的文件都将PDF文件 – MB34 2010-08-19 15:16:58

+4

如果你有机会获得代码,你知道所有的文件将是PDF文件,你可以只硬编码类型检测功能(s)返回“应用程序/ pdf”... – cHao 2010-08-19 15:21:45

+0

这就是我们现在正在做的,但是,以防万一我们开始提供其他类型,我需要更灵活。 – MB34 2010-08-19 15:31:59

回答

0

既然你有访问代码,您可以更改保存在那里它被转换成散列文件的方法,并添加一些代码块:
1)保存文件之前,请自行保存扩展名。
2)生成哈希后,将扩展名附加到文件并保存或将其记录在某处(数据文件,数据库等)
3)更新生成散列的任何位置以将扩展名考虑在内。

这可能不是与软件的实际问题的解决方案,但它应该让你保存文件类型...

+0

I能够根据display_filename的扩展名(它是下载对话框获取的文件的名称)来更改代码强制MIME类型。 – MB34 2010-08-21 22:19:17