上传带有 codeigniter、mime 类型错误的 xls 或 xlsx 文件

Posted

技术标签:

【中文标题】上传带有 codeigniter、mime 类型错误的 xls 或 xlsx 文件【英文标题】:Upload xls or xlsx files with codeigniter, mime-type error 【发布时间】:2012-02-28 07:52:37 【问题描述】:

嗯,我相信这不是 Codeigniter 问题本身,因为它更像是一个 mime 类型

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

奇怪的(est)事情可能是相同的代码工作了几个月,现在停止在最新的 Chrome (16.0.912.77)、Firefox (10.0) 和 IE9 上工作。

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

非常感谢。 PS:我不会提供代码,因为它不是真正的代码问题,但如果有必要我会上传一些sn-ps。

编辑

这可能是相关的:错误不会发生在具有类似配置的相同浏览器上,而是使用 MS Office 而不是 Libre Office(在我的电脑上)。它也不会发生在基于 GNU/Linux + Libre Office 的系统上。那么,可能是 Windows 在开源套件上玩得很辛苦,还是 Libre Office 改变 mime-types 只是为了它?

【问题讨论】:

【参考方案1】:

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

测试/转储服务器 mime 类型也是一件好事。

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

AddType application/excel .xls .xlsx

对于整个调试过程,使用文件助手 (http://codeigniter.com/user_guide/helpers/file_helper.html) 使用 get_mime_by_extension($file) 测试各种办公文件

【讨论】:

感谢您的回答。不幸的是,我已经在使用 CI 2.1.0,所以问题不能(不应该)是这样的。我测试了 $_FILES[$field]['tmp_name'] 它也是“application/octet-stream”。最奇怪的是,这只发生在我的机器上。后来我在另一台机器上使用相同的浏览器和操作系统进行了测试(唯一的区别是 Libre Office(在我的电脑上)和 MS Office 在另一台上),它运行良好。还在安装了 Libre Office 的基于 linux 的操作系统中进行了测试,它也运行良好。我将尝试 .htaccess 方法。谢谢你。 好吧。尝试了 .htaccess 方法。没有。我可能会让这个问题休息一下,因为该应用程序是供亲密客户内部使用的,并且对他们来说工作正常。无论如何,我很想找到这个问题的原因,如果没有,我会接受你的回答。它可能会帮助其他人。【参考方案2】:

我也遇到了这个错误。

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

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

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

并且有效(至少对于这个浏览器!)

【讨论】:

嗯,它可能会解决问题,但如果我没记错的话,它会允许上传不是 xlsx 文件的 .zip 文件。 是的,我最初是这么想的,但是 CI 会检查文件扩展名和 mime 类型,所以如果您尝试上传 zip 文件,因为扩展名是 zip 而不是 xlsx,它会引发错误。我还在 mimes.php 文件中添加了以下几行,用于我一直在做的工作:'slk' => 'text/plain', 'xlsx' => array('application/vnd.openxmlformats-officedocument. spreadsheetml.sheet','application/zip'), 'ods' => 'application/octet-stream 带有 xlsx 扩展名的 zip 文件(而不是有效的 xlsx 文件)怎么样? 尽管如此,你的方法总比没有测试好,所以我会接受你的回答。 这可能与 CI 完全无关。当我从 IE 7 浏览器上传 .xlxs 文件时,我将 $_FILES['file_browser']['type'] 作为应用程序/八位字节流。所以我在我的代码点火器的 mime 文件中添加了 'xlsx' => array('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet','application/octet-stream') 【参考方案3】:

为了记录,我找到了原因,Windows 注册表中缺少 mime-type,解决了使用 .reg 文件添加这些键:

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"

但宁愿使用上面的解决方案,我也不喜欢乱搞注册表。

【讨论】:

【参考方案4】:

请仔细阅读以下描述和提示,轻松获得答案!

说明:

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

'xlsx'  =>  array('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/zip'), 
但我已经意识到,在 **CodeIgniter 2.2.*** 版本中,问题有点不同! 他们已经添加了该行,但忘记添加以下“file_type”==> 'application/vnd.ms-excel'
'xlsx'  =>  array('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/zip', 'application/vnd.ms-excel'),

所以把上面的'application/vnd.ms-excel'加入到xlsx文件类型的数组中,让我上传.xlsx 文件!

提示:

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

您尝试上传的文件类型不允许。

在控制器的上传方法中执行以下操作,

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

它会给你一个巨大的数组,你可以从这个link得到一个想法。(请看那页的结尾)。在该数组中,您可以获得您尝试上传但不让您上传的文件的真正 mime_type。

答案:

就我而言,我的文件扩展名是 .xlsx ,mime 类型是 application/vnd.ms-excel ,没有添加到 p>

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

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

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

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

并保存如下,

'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 社区都有帮助,我花了一些时间才发布它!

【讨论】:

以上是关于上传带有 codeigniter、mime 类型错误的 xls 或 xlsx 文件的主要内容,如果未能解决你的问题,请参考以下文章

Codeigniter psd 和 ai mime 类型不起作用

Codeigniter 调试上传不支持的类型文件

Codeigniter:MP4 视频上传不起作用

CodeIgniter 中视频文件上传的奇怪问题

PHP版本会影响codeigniter中的MIME.php吗

Laravel Mime 类型验证(KML 文件)