关于php:使用codeigniter上载xls或xlsx文件,MIME类型错误

Upload xls or xlsx files with codeigniter, mime-type error

好吧,我相信这本身并不是Codeigniter的问题,因为它更像是哑剧类型。

我正在尝试上载一个文件,一个xls(或xlsx)文件和mime类型的浏览器,而php报告是application / octet-stream而不是application / excel,application / vnd.ms-excel或application / msexcel用于xls文件。当然,codeigniter上载插件会尝试将文件扩展名与mime-type匹配时报告错误(无效的文件类型)。

奇怪的是,相同的代码已经工作了几个月,现在却停止使用最新的Chrome(16.0.912.77),Firefox(10.0)和IE9。

是否有人遇到过相同(或相似)的问题并愿意分享解决方案?

非常感谢你。
PS:我不会提供代码,因为这并不是真正的代码问题,但是如有必要,我会上传一些代码片段。

编辑

可能是相关的:在具有类似配置的相同浏览器上,但在MS Office而非Libre Office上(在我的电脑上),不会发生该错误。在基于GNU / Linux + Libre Office的系统上也不会发生这种情况。因此,是Windows在开源套件上发挥作用,还是Libre Office仅仅为了改变它而改变了mime类型?


我也收到此错误。

CI报告的文件类型为" application / zip",这很有意义,因为xlsx格式是压缩格式(将其重命名为zip即可打开内容)。

我已将以下行添加/替换为mime类型文件(application / config / mimes.php):

1
'xlsx' => array('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet','application/zip'),

并且有效(至少适用于该浏览器!)


请通过以下说明和提示轻松获得答案!

描述:

实际上,有很多人建议在文件(application / config / mimes.php)中添加/替换以下行:

1
'xlsx'  =>  array('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/zip'),


但是我已经意识到,在CodeIgniter版本2.2。*中,问题有点不同!
他们已经添加了该行,但是忘记添加以下" file_type" ==>'application / vnd.ms-excel'

1
'xlsx'  =>  array('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/zip', 'application/vnd.ms-excel'),

因此,将上面的'application / vnd.ms-excel'添加到xlsx文件类型数组中,让我上传.xlsx文件!

暗示:

每当您在CodeIgniter平台上遇到以下错误并上传文件时:

The filetype you are attempting to upload is not allowed.

在Controller的上载方法中执行以下操作,

1
var_dump($this->upload->data());

它将为您提供一个庞大的数组,您可以从此链接中获得想法(请参阅该页面的末尾)。在该数组中,您可以获得尝试上载但不给您上载的文件的真正mime_type是什么。

回答:

在我的情况下,我的文件扩展名为.xlsx,而mime类型为application / vnd.ms-excel,该文件未添加到

1
'xlsx'  =>  array('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/zip'),

所以我手动添加了它,然后它就可以正常工作了!!!

当我将文件扩展名添加为.csv,但将MIME类型为text / plain时,再次将CSV上传到同一行时,发生了同样的事情:

1
'csv'   =>  array('text/x-comma-separated-values', 'text/comma-separated-values', 'application/octet-stream', 'application/vnd.ms-excel', 'application/x-csv', 'text/x-csv', 'text/csv', 'application/csv', 'application/excel', 'application/vnd.msexcel');

并保存如下

1
'csv'   =>  array('text/x-comma-separated-values', 'text/comma-separated-values', 'application/octet-stream', 'application/vnd.ms-excel', 'application/x-csv', 'text/x-csv', 'text/csv', 'application/csv', 'application/excel', 'application/vnd.msexcel', 'text/plain'),

它就像一个魅力! :D
尝试一下,如果您在上述步骤中发现了新的内容,请在此处评论!!!
因此,希望这对所有CodeIgniter社区有所帮助,我花了一些时间发布它!

致以最诚挚的问候,

兰迪卡


仅作记录,我发现Windows注册表中缺少mime-type的原因,解决了使用.reg文件添加这些键的问题:

1
2
3
4
5
6
7
Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\\Software\\Classes\\.xls]
"Content Type"="application/excel"

[HKEY_CURRENT_USER\\Software\\Classes\\.xlsx]
"Content Type"="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"

但是宁愿使用上面的解决方案,我也不希望弄乱注册表。


几个月前这是一个CI错误:https://github.com/EllisLab/CodeIgniter/issues/394。该框架中的mimes.php已更新,并且错误已得到解决。将您的CodeIgniter库更新为2.1.0(或更高版本)。

服务器mime类型也是测试/转储的好东西。

另一种选择是强制mime类型。使用.htaccess,那将是

1
AddType application/excel .xls .xlsx

对于整个调试过程,请使用File Helper(http://codeigniter.com/user_guide/helpers/file_helper.html)使用get_mime_by_extension($file)测试各种Office文件。