2010-08-19 65 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