CodeIgniter上传MXF文件失败:类型不允许且调用报404错误
首先,你遇到的核心问题是CodeIgniter的上传类默认不识别MXF文件的MIME类型——哪怕你在allowed_types里加了mxf,系统还是没法匹配到对应的合法MIME,所以抛出类型不允许的错误;而404大概率是上传失败后你的代码没有正确处理错误(比如错误跳转了不存在的路由),本质还是上传验证不通过导致的连锁问题。
下面给你几个靠谱的解决办法,按优先级排序:
1. 修改CodeIgniter的MIME类型配置文件(最直接)
CodeIgniter的上传类依赖application/config/mimes.php里的后缀-MIME映射表,默认这个表没有MXF的条目。你只需要打开这个文件,在数组里添加一行:
'mxf' => array('application/mxf', 'video/mxf'),
MXF的标准MIME类型是application/mxf,部分场景下也会被识别为video/mxf,所以把两个都加上更稳妥。保存后重新测试上传,应该就能通过类型验证了。
2. 在控制器中动态添加MIME类型(无需修改核心配置)
如果担心后续升级CodeIgniter会覆盖mimes.php的修改,你可以在上传逻辑里动态注入MXF的MIME映射:
public function uploadFile() { // 基础上传配置 $config['upload_path'] = './uploads/'; $config['allowed_types'] = 'mxf|mp4|png'; // 确保这里包含mxf $config['max_size'] = 10240; // 根据你的需求调整大小 $this->load->library('upload', $config); // 动态添加MXF的MIME类型映射 $existing_mimes = $this->upload->mimes; $existing_mimes['mxf'] = array('application/mxf', 'video/mxf'); $this->upload->set_mime_types($existing_mimes); // 执行上传 if (!$this->upload->do_upload('userfile')) { // 这里直接返回错误,不要随便跳转,避免404 echo $this->upload->display_errors(); } else { // 上传成功后的处理逻辑 $upload_data = $this->upload->data(); print_r($upload_data); } }
这个方法会在当前请求中临时扩展MIME类型表,不会影响全局配置。
3. 检查服务器的MIME配置(兜底方案)
如果上面两种方法都没用,可能是你的服务器(比如Apache/Nginx)的MIME配置里没有MXF的条目,导致PHP的文件类型识别函数(finfo或mime_content_type)返回了错误的MIME类型。
- 对于Apache:找到服务器的
mime.types文件,添加一行application/mxf mxf,然后重启Apache。 - 对于Nginx:在
nginx.conf或站点配置里添加types { application/mxf mxf; },重启Nginx。
不过这个操作需要服务器权限,如果你用的是虚拟主机,可能需要联系服务商帮忙配置。
最后再提醒一下:你的404错误,记得检查上传失败后的代码逻辑——不要在验证失败时直接redirect到某个未定义的路由,应该直接输出错误信息或者返回JSON错误响应,这样就能避免404的问题了。
内容的提问来源于stack exchange,提问作者Edo Barrios Garrido

