The Problem (Q-score 7, ranked #45th of 95 in the VBA Core archive)
The scenario as originally posted in 2012
I have the following:
$mimeTypes = array('application/msword'); //used to be an array
$finfo = new finfo(FILEINFO_MIME, "/usr/share/misc/magic");
$type = $finfo->file($_FILES['userfile']['tmp_name']);
$mime = substr($type, 0, strpos($type, ';'));
if (in_array($mime, $mimeTypes))
{ //let it in
The problem is that I am getting “application/vnd.ms-office” as the filetype for any MSOFFICE file that I attempt to upload. I DO NOT wish to allow all MSOFFICE files, only .DOC’s. Is there a workaround for this?
**Please note that these MSOFFICE type files were created in OPENOFFICE, would this make a difference?
Why community consensus is tight on this one
Across 95 VBA Core entries in the archive, the accepted answer here holds solid answer (above median) status — meaning voters are unusually aligned on the right fix.
The Verified Solution — solid answer (above median) (+10)
4-line VBA Core pattern (copy-ready)
The best you can do is verify file extension after know the file is a Office document (application/vnd.ms-office) and set manually the correct MIME for current file.
If you have access to Apache, you can add the correct MIME in conf/mime.types
application/msword doc
application/vnd.ms-excel xls
[..] etc
List of Office MIME Types (from http://filext.com/faq/office_mime_types.php)
.doc application/msword
.dot application/msword
.docx application/vnd.openxmlformats-officedocument.wordprocessingml.document
.dotx application/vnd.openxmlformats-officedocument.wordprocessingml.template
.docm application/vnd.ms-word.document.macroEnabled.12
.dotm application/vnd.ms-word.template.macroEnabled.12
.xls application/vnd.ms-excel
.xlt application/vnd.ms-excel
.xla application/vnd.ms-excel
.xlsx application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
.xltx application/vnd.openxmlformats-officedocument.spreadsheetml.template
.xlsm application/vnd.ms-excel.sheet.macroEnabled.12
.xltm application/vnd.ms-excel.template.macroEnabled.12
.xlam application/vnd.ms-excel.addin.macroEnabled.12
.xlsb application/vnd.ms-excel.sheet.binary.macroEnabled.12
.ppt application/vnd.ms-powerpoint
.pot application/vnd.ms-powerpoint
.pps application/vnd.ms-powerpoint
.ppa application/vnd.ms-powerpoint
.pptx application/vnd.openxmlformats-officedocument.presentationml.presentation
.potx application/vnd.openxmlformats-officedocument.presentationml.template
.ppsx application/vnd.openxmlformats-officedocument.presentationml.slideshow
.ppam application/vnd.ms-powerpoint.addin.macroEnabled.12
.pptm application/vnd.ms-powerpoint.presentation.macroEnabled.12
.potm application/vnd.ms-powerpoint.template.macroEnabled.12
.ppsm application/vnd.ms-powerpoint.slideshow.macroEnabled.12
When to Use It — vintage (14+ years old, pre-2013)
Ranked #45th in its category — specialized fit
This pattern sits in the 92% tail relative to the top answer. Reach for it when your scenario closely matches the question title; otherwise browse the VBA Core archive for a higher-consensus alternative.
What changed between 2012 and 2026
The answer is 14 years old. The VBA Core object model has been stable across Office 2013, 2016, 2019, 2021, 365, and 2024/2026 LTSC, so the pattern still compiles. Changes that might affect you: 64-bit API declarations (use PtrSafe), blocked macros in downloaded files (Mark-of-the-Web), and the shift toward Office Scripts for web-first workflows.